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 collections模块实例讲解
Apr 07 Python
分享Python开发中要注意的十个小贴士
Aug 30 Python
分享几道你可能遇到的python面试题
Jul 24 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
用python统计代码行的示例(包括空行和注释)
Jul 24 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
Python 按比例获取样本数据或执行任务的实现代码
Dec 03 Python
pytorch 如何使用amp进行混合精度训练
May 24 Python
Python语言规范之Pylint的详细用法
Jun 24 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中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php中 $$str 中 "$$" 的详解
2015/07/06 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
JavaScript学习历程和心得小结
2010/08/16 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
Python中字典的基础知识归纳小结
2015/08/19 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
Python批量发送post请求的实现代码
2018/05/05 Python
django用户登录和注销的实现方法
2018/07/16 Python
Python3标准库总结
2019/02/19 Python
python实现共轭梯度法
2019/07/03 Python
flask应用部署到服务器的方法
2019/07/12 Python
django使用JWT保存用户登录信息
2020/04/22 Python
python将unicode和str互相转化的实现
2020/05/11 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
财务总监岗位职责
2014/03/07 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
学习经验交流会策划书
2015/11/02 职场文书
MySQL分布式恢复进阶
2022/07/23 MySQL