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代码制作configure文件示例
Jul 28 Python
python根据出生年份简单计算生肖的方法
Mar 27 Python
python实现在控制台输入密码不显示的方法
Jul 02 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
详谈python在windows中的文件路径问题
Apr 28 Python
python pandas模块基础学习详解
Jul 03 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
django框架两个使用模板实例
Dec 11 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
使用pytorch 筛选出一定范围的值
Jun 28 Python
PyTorch 如何自动计算梯度
May 23 Python
Python利用FlashText算法实现替换字符串
Mar 31 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编写的简单页面跳转功能实现代码
2013/11/27 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
js切换光标示例代码
2013/10/10 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
python 用struct模块解决黏包问题
2020/11/07 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
环境工程毕业生自荐信
2013/11/17 职场文书
医学检验专业个人求职信范文
2013/12/04 职场文书
酒店营销策划方案
2014/02/07 职场文书
老同学聚会感言
2014/02/23 职场文书
少先队活动总结
2014/08/29 职场文书
你真的了解PHP中的引用符号(&)吗
2021/05/12 PHP
python中%格式表达式实例用法
2021/06/18 Python
一文搞懂Java中的注解和反射
2022/06/21 Java/Android