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. 11/6笔记 补充(Redis持久化,RDB&&AOF)

    11/6补充笔记 修改redis-6379.conf里面的save10秒2个数据发生改变 (save 10 2) 修改一次数据不发生改变,修改2次数据才发生改变 继续修改数据,发现还是一样的规律 增删 ...

  2. 1、Web应用

    一 Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览 ...

  3. -bash: bash_profile: command not found问题

    这个问题一般就是.bash_profile 文件内容错误,里面内容没加注释之内的,vi .bash_profile打开文件检查一下,然后:wq!保存退出 我的错误就是红圈处没有注释造成的

  4. 完全卸载node.js

    1.通过控制面板卸载node.js 2.删除安装所在文件夹下的nodejs文件夹[我的是 C:\Program Files\nodejs] 3.删除C:\Users\xxx(自己电脑的名字)下的.np ...

  5. 索引--mysql 数据库Load data大量数据时性能因素之一

    发现load data infile 插入数据时越来越慢,后来发现是因为创建表时有创建索引的动作. 把索引创建删除掉之后,导入很迅速,导入后再创建索引,效率果有提高.

  6. CSS 三栏自适应布局

    CSS布局 这个很基础,方法也很多,要留意的知识点还是有一些. 比如IE6的触发layout  *zoom:1 比如使用浮动后的清除浮动  clear:both 需求的延伸也会有一些: 比如三栏等高 ...

  7. python之路 《四》 字典

    python中的字典使得python来解决问题变得更方便,顾名思义,就是当我知道关键字(key)那么我就可以通过key来找到与之对应的信息. 简单的来说字典是另一种可变容器模型,且可存储任意类型对象. ...

  8. C/C++宏替换详解

    目录 1. 基本形式 2. 宏展开中的陷阱 3. #undef 4. 宏参数.# 和 ## 1. 基本形式 #define name replacement_text 通常情况下,#define 指令 ...

  9. 一文看懂Java序列化之serialVersionUID

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  10. Map结合Function函数式接口的巧妙之处

    需求:在给定 List 集合中,需根据不同的算法规则,选取计算方式并返回结果: 例如:[1, 2, 3, 4, 5] List 集合中都是 Integer 类型数据,根据提供的算法规则,sum 求和, ...