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中使用PyHook监听鼠标和键盘事件实例
Jul 18 Python
分享一个常用的Python模拟登陆类
Mar 29 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
对python 操作solr索引数据的实例详解
Dec 07 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
Python基于百度AI实现OCR文字识别
Apr 02 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 Python
python爬虫中的url下载器用法详解
Nov 30 Python
python OpenCV学习笔记
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
文件上传程序的全部源码
2006/10/09 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
js字符编码函数区别分析
2008/06/05 Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
js Date概念详细介绍
2013/11/22 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
2015/07/29 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python日志模块logging简介
2015/04/13 Python
Python正则表达式完全指南
2017/05/25 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
python多进程读图提取特征存npy
2019/05/21 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
简单了解如何封装自己的Python包
2020/07/08 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
中国宠物用品商城:E宠商城
2016/08/27 全球购物
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
咖啡馆创业计划书
2014/01/26 职场文书
同事吵架检讨书
2014/02/05 职场文书
2014年小学工作总结
2014/11/26 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
浅析Python实现DFA算法
2021/06/26 Python
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript