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的Django框架中编写错误提示页面
Jul 22 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
python监控文件或目录变化
Jun 07 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
python实现移位加密和解密
Mar 22 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
Python实现串口通信(pyserial)过程解析
Sep 25 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
对PyTorch中inplace字段的全面理解
May 22 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实现的带超时功能get_headers函数
2015/02/10 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
JavaScript 学习笔记(六)
2009/12/31 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
jquery中each循环的简单回滚操作
2017/05/05 jQuery
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
在RedHat系Linux上部署Python的Celery框架的教程
2015/04/07 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
HEMA英国:荷兰原创设计
2018/08/28 全球购物
史上最全面的Java面试题汇总!
2015/02/03 面试题
关于人生的感言
2014/01/17 职场文书
科研先进个人典型材料
2014/01/31 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
高三高考决心书
2014/03/11 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
接收函格式
2015/01/30 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL