Queue的使用

Queue在数据结构中也接触过,在操作系统里面叫消息队列。
使用示例
# coding=utf-8
from multiprocessing import Queue q = Queue(3) # 初始化⼀个Queue对象, 最多可接收三条put消息
q.put("消息1")
q.put("消息2")
print(q.full()) # False
q.put("消息3")
print(q.full()) # True # 因为消息列队已满下⾯的try都会抛出异常, 第⼀个try会等待2秒后再抛出异常, 第⼆个Try会⽴
try:
q.put("消息4", True, 2)
except:
print("消息列队已满, 现有消息数量:%s" % q.qsize())
try:
q.put_nowait("消息4")
except:
print("消息列队已满, 现有消息数量:%s" % q.qsize())
# 推荐的⽅式, 先判断消息列队是否已满,再写⼊
if not q.full():
q.put_nowait("消息4")
#读取消息时, 先判断消息列队是否为空, 再读取
if not q.empty():
for i in range(q.qsize()):
print(q.get_nowait())

运行结果

False
True
消息列队已满, 现有消息数量:3
消息列队已满, 现有消息数量:3
消息1
消息2
消息3

注意:若Queue()没有指定最大可接受的消息数量,或者为一个负数,那么就代表可以接受的消息数没有上限。

Queue的常用属性和方法

Queue.qsize(): 返回当前队列包含的消息数量;

Queue.empty(): 如果队列为空, 返回True, 反之False ;

Queue.full(): 如果队列满了, 返回True,反之False;

Queue.get([block[, timeout]]): 获取队列中的⼀条消息, 然后将其从列队中移除, block默认值为True;
(1)如果block使用默认值,且没有设置超时时间,则会堵塞,直到读出消息为止,如果设置了超时时间,则会等待完毕,如果还没收到消息报“Queue.Empty”异常
(2)如果block值为False,如果没有收到消息,会立即报“Queue.Empty”异常,其中Queue.put_nowait(item): 相当于Queue.put(item, False);

Queue用于进程通信

from multiprocessing import Process, Queue
import os, time, random # 写数据进程执⾏的代码:
def write(q):
for value in ['A', 'B', 'C']:
print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())
# 读数据进程执⾏的代码: def read(q):
while True:
if not q.empty():
value = q.get(True)
print('Get %s from queue.' % value)
time.sleep(random.random())
else:
break if __name__ == '__main__':
# ⽗进程创建Queue, 并传给各个⼦进程:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
# 启动⼦进程pw, 写⼊:
pw.start()
# 等待pw结束:
pw.join()
# 启动⼦进程pr, 读取:
pr.start()
pr.join()
# pr进程⾥是死循环, ⽆法等待其结束, 只能强⾏终⽌:
print('')
print('所有数据都写⼊并且读完')

运行结果

Put A to queue...
Put B to queue...
Put C to queue...
Get A from queue.
Get B from queue.
Get C from queue. 所有数据都写⼊并且读完

进程池中使用Queue

如果要在pool中使用进程,就要用到multiprocessing.Manager()中的Queue(),而不能是multiprocessing.Queue(),否则会报异常:RuntimeError: Queue objects should only be shared between processes
#coding=utf-8
#修改import中的Queue为Manager
from multiprocessing import Manager,Pool
import os,time,random def reader(q):
print("reader启动(%s),⽗进程为(%s)"%(os.getpid(),os.getppid()))
for i in range(q.qsize()):
print("reader从Queue获取到消息: %s"%q.get(True)) def writer(q):
print("writer启动(%s),⽗进程为(%s)"%(os.getpid(),os.getppid()))
for i in "dongGe":
q.put(i) if __name__=="__main__":
print("(%s) start"%os.getpid()) q=Manager().Queue() #使⽤Manager中的Queue来初始化
po=Pool()
#使⽤阻塞模式创建进程, 这样就不需要在reader中使⽤死循环了, 可以让writer完全执⾏完
po.apply(writer,(q,))
po.apply(reader,(q,))
po.close()
po.join()
print("(%s) End"%os.getpid())

运行结果

(5740) start
writer启动(5746),⽗进程为(5740)
reader启动(5747),⽗进程为(5740)
reader从Queue获取到消息: d
reader从Queue获取到消息: o
reader从Queue获取到消息: n
reader从Queue获取到消息: g
reader从Queue获取到消息: G
reader从Queue获取到消息: e
(5740) End

python核心高级学习总结4-------python实现进程通信的更多相关文章

  1. python核心高级学习总结5--------python实现线程

    在代码实现上,线程的实现与进程的实现很类似,创建对象的格式都差不多,然后执行的时候都是用到start()方法,与进程的区别是进程是资源分配和调度的基本单位,而线程是CPU调度和分派的基本单位.其中多线 ...

  2. python核心高级学习总结7---------正则表达式

    正则表达式在爬虫项目中应用很广泛,主要方面就是在字符串处理方面,经常会涉及到字符串格式的校验,用起来经常要查看文档才能完成,所以抽了个时间将正则的内容复习了一下. Start re---导入re模块使 ...

  3. python核心高级学习总结8------动态性、__slots__、生成器、迭代器、装饰、闭包

    python的动态性 什么是动态性呢,简单地来说就是可以在运行时可以改变其结构,如:新的函数.对象.代码都可以被引进或者修改,除了Python外,还有Ruby.PHP.javascript等也是动态语 ...

  4. python核心高级学习总结6------面向对象进阶之元类

    元类引入 在多数语言中,类就是一组用来描述如何生成对象的代码段,在python中同样如此,但是在python中把类也称为类对象,是的,你没听错,在这里你只要使用class关键字定义了类,其解释器在执行 ...

  5. python核心高级学习总结3-------python实现进程的三种方式及其区别

    python实现进程的三种方式及其区别 在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.f ...

  6. python核心高级学习总结1---------*args和**kwargs

    *args 和 ** kwargs 的用法 首先,这两者在用法上都是用来补充python中对不定参数的接受. 比如下面的列子 def wrappedfunc(*args, **kwargs): pri ...

  7. python核心高级学习总结2----------pdb的调试

    PDB调试 def getAverage(a,b): result =a+b print("result=%d"%result) return result a=100 b=200 ...

  8. python核心编程学习记录之Python对象

    比较符号如<,>,=比较的是对象的值 如果要比较对象本身要用is,is not repr()的功能与''所做的事情是一样的 Python不支持的类型有char,byte,指针,short, ...

  9. 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享

    近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...

随机推荐

  1. zookeeper单机/集群安装和使用

    简书原文地址:https://www.jianshu.com/p/88194fde9a07 或者关注我的公众号"进阶者euj" 前提是本机有jdk 一.单机安装 1.去官网下载zo ...

  2. MarkdownPad 2中编辑

    一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 #######七级标题 ########八级标题 #!/bin/bash declare -i evenSum=0 declare -i i ...

  3. angularJS 小记

    刚刚接触angularJS,网上学习了一遍菜鸟教程(http://www.runoob.com/angularjs/angularjs-tutorial.html),做了些基础知识的笔记. Angul ...

  4. 内网渗透 day13-漏洞复现

    漏洞复现 目录 1. 永恒之蓝(445端口) 2. 手动微笑漏洞(21端口 vsftpd2.3.4版本) 3. ingres数据库DBMS后门(1524端口) 4. distcc漏洞(3632) 5. ...

  5. 这个Map你肯定不知道,毕竟存在感确实太低了。

    这是why哥的第 75 篇原创文章 从Dubbo的优雅停机说起 好吧,其实本文并不是讲 Dubbo 的优雅停机的. 只是我在 Dubbo 停机方法 DubboShutdownHook 类中,看到了这样 ...

  6. 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...

  7. http 请求体数据处理2--ngx

    HTTP 处理数据包, 有的业务不需要,此时只需要将数据包文读取后丢弃, 但是ngx 为什么还要提供一个丢弃接口呢???解决了什么问题?? ------对于HTTP模块而言,放弃接收包体就是简单地不处 ...

  8. 聊一聊无锁队列rte_ring

    之前用基于dpdk 实现小包快速转发的时候有用到无锁队列!今天就来看看吧!(后续完成了去dpdk化,直接在内核完成快速转发功能) dpdk的无锁队列ring是借鉴了linux内核kfifo无锁队列.r ...

  9. CDC(跨时钟域)和亚稳态

  10. python之路 《六》函数

    ---恢复内容开始--- 为什么要有函数? 当你的老板要你写一个程序 1 def 函数0(): 2 # 如果cpu占用率>90 3 # 发送邮件 4 # 发出警报 5 6 def 函数1(): ...