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代码编辑器的选用(详解)
Sep 13 Python
Python如何生成树形图案
Jan 03 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 Python
python3反转字符串的3种方法(小结)
Nov 07 Python
利用Python计算KS的实例详解
Mar 03 Python
python实现ftp文件传输功能
Mar 20 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 Python
python基于opencv 实现图像时钟
Jan 04 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中仿制 ecshop验证码实例
2017/01/06 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
JavaScript中获取元素索引的函数
2010/09/10 Javascript
javascript 节点排序 2
2011/01/31 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
2016/11/07 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
微信小程序支付PHP代码
2018/08/23 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
layui实现给某一列加点击事件
2019/10/26 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
解决Python3 抓取微信账单信息问题
2019/07/19 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
美国牛仔品牌:True Religion
2018/11/16 全球购物
开学典礼演讲稿
2014/05/23 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
员工年终自我评价
2014/09/14 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
Oracle笔记
2021/04/05 Oracle
python生成随机数、随机字符、随机字符串
2021/04/06 Python
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
golang 语言中错误处理机制
2021/08/30 Golang