Python进程间通信Queue实例解析


Posted in Python onJanuary 25, 2018

本文研究的主要是Python进程间通信Queue的相关实例,具体如下。

1.Queue使用方法:

  • Queue.qsize():返回当前队列包含的消息数量;
  • Queue.empty():如果队列为空,返回True,反之False ;
  • Queue.full():如果队列满了,返回True,反之False;
  • Queue.get():获取队列中的一条消息,然后将其从列队中移除,可传参超时时长。
  • Queue.get_nowait():相当Queue.get(False),取不到值时触发异常:Empty;
  • Queue.put():将一个值添加进数列,可传参超时时长。
  • Queue.put_nowait():相当于Queue.get(False),当队列满了时报错:Full。

2.Queue使用实例:

来,上代码:

#!/usr/bin/env python3

import time
from multiprocessing import Process,Queue

q = Queue() #创建列队,不传数字表示列队不限数量
for i in range(11):
  q.put(i)

def A():
  while 1:
    try:
      num = q.get_nowait()
      print('我是进程A,取出数字:%d'%num)
      time.sleep(1)
    except :
      break

def B():
  while 1:
    try:
      num = q.get_nowait()
      print('我是进程B,取出数字:%d'%num)
      time.sleep(1)
    except :
      break

p1 = Process(target = A)
p2 = Process(target = B)
p1.start()
p2.start()

此程序是在队列中加入10个数字,然后用2个进程来取出。

运行结果:

我是进程A,取出数字:0
我是进程B,取出数字:1
我是进程A,取出数字:2
我是进程B,取出数字:3
我是进程A,取出数字:4
我是进程B,取出数字:5
我是进程B,取出数字:6
我是进程A,取出数字:7
我是进程B,取出数字:8
我是进程A,取出数字:9
我是进程B,取出数字:10

3.使用进程池Pool时,Queue会出错,需要使用Manager.Queue:

上代码

#!/usr/bin/env python3

import time
from multiprocessing import Pool,Manager,Queue

q = Manager().Queue()
for i in range(11):
  q.put(i)

def A(i):
  num = q.get_nowait()
  print('我是进程%d,取出数字:%d'%(i,num))
  time.sleep(1)
      

pool = Pool(3)

for i in range(10):
  pool.apply_async(A,(i,))

pool.close()
pool.join()

运行结果:

我是进程1,取出数字:0
我是进程0,取出数字:1
我是进程2,取出数字:2
我是进程4,取出数字:3
我是进程3,取出数字:4
我是进程5,取出数字:5
我是进程6,取出数字:6
我是进程7,取出数字:7
我是进程8,取出数字:8
我是进程9,取出数字:9

当把Manager().Queue()直接换成Queue(),可能会出现资源混乱,缺少进程。

4.主进程定义了一个Queue类型的变量,并作为Process的args参数传给子进程processA和processB,两个进程一个向队列中写数据,一个读数据。

import time
from multiprocessing import Process,Queue

MSG_QUEUE = Queue(5)

def startA(msgQueue):
  while True:
    if msgQueue.empty() > 0:
      print 'queue is empty %d' % (msgQueue.qsize())
    else:
      msg = msgQueue.get()
      print 'get msg %s' % (msg,)
    time.sleep(1)

def startB(msgQueue):
  while True:
    msgQueue.put('hello world')
    print 'put hello world queue size is %d' % (msgQueue.qsize(),)
    time.sleep(3)

if __name__ == '__main__':
  processA = Process(target=startA,args=(MSG_QUEUE,))
  processB = Process(target=startB,args=(MSG_QUEUE,))

  processA.start()
  print 'processA start..'

  processB.start()
  print 'processB start..'

其打印的结果如下:

C:\Python27\python.exe E:/outofmemory/test/queuetest/queuetest.py
processA start..
processB start..
queue is empty 0
put hello world queue size is 1
get msg hello world
queue is empty 0
queue is empty 0
put hello world queue size is 1
get msg hello world
queue is empty 0
queue is empty 0
put hello world queue size is 1

总结

以上就是本文关于Python进程间通信Queue实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python tkinter事件高级用法实例
Jan 31 Python
python实现百度语音识别api
Apr 10 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
详解Python利用random生成一个列表内的随机数
Aug 21 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
python实现井字棋小游戏
Mar 04 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
Python自动化办公Excel模块openpyxl原理及用法解析
Nov 05 Python
关于python中模块和重载的问题
Nov 02 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 #Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 #Python
python画出三角形外接圆和内切圆的方法
Jan 25 #Python
Python实现批量压缩图片
Jan 25 #Python
python生成圆形图片的方法
Mar 25 #Python
scrapy spider的几种爬取方式实例代码
Jan 25 #Python
scrapy爬虫完整实例
Jan 25 #Python
You might like
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
PHP/HTML混写的四种方式总结
2017/02/27 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
Python字符串转换成浮点数函数分享
2015/07/24 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
一份python入门应该看的学习资料
2018/04/11 Python
python实现贪吃蛇游戏
2020/03/21 Python
python使用递归的方式建立二叉树
2019/07/03 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
keras 多gpu并行运行案例
2020/06/10 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
中专自我鉴定范文
2013/10/16 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
Flink 侧流输出源码示例解析
2022/09/23 Servers