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读写文件操作示例程序
Dec 02 Python
跟老齐学Python之玩转字符串(3)
Sep 14 Python
python批量提取word内信息
Aug 09 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
Python序列化基础知识(json/pickle)
Oct 19 Python
《Python学习手册》学习总结
Jan 17 Python
python的pandas工具包,保存.csv文件时不要表头的实例
Jun 14 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
在python中求分布函数相关的包实例
Apr 15 Python
Python使用OpenPyXL处理Excel表格
Jul 02 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&mysql(二)
2006/10/09 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
解释&&和||在javascript中的另类用法
2014/07/28 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
搞定immutable.js详细说明
2016/05/02 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
Python中的浮点数原理与运算分析
2017/10/12 Python
Python 将pdf转成图片的方法
2018/04/23 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
表决心的诗句大全
2014/03/11 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
go xorm框架的使用
2021/05/22 Golang
Javascript的promise,async和await的区别详解
2022/03/24 Javascript
AngularJS实现多级下拉框
2022/03/25 Javascript