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中映射类型的内建函数和工厂函数
Aug 19 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python读文件的步骤
Oct 08 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
Python 实现进度条的六种方式
Jan 06 Python
pycharm2021激活码使用教程(永久激活亲测可用)
Mar 30 Python
教你怎么用Python生成九宫格照片
May 20 Python
python 判断文件或文件夹是否存在
Mar 18 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
PHPLog php 程序调试追踪工具
2009/09/09 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
Vue核心概念Getter的使用方法
2019/01/18 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
初中优秀教师事迹材料
2014/08/18 职场文书
心得体会的写法
2014/09/05 职场文书
会计实训报告范文
2014/11/04 职场文书
平安家庭事迹材料
2014/12/20 职场文书
投标售后服务承诺书
2015/04/29 职场文书
导游词之凤凰古城
2019/10/22 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
JAVA springCloud项目搭建流程
2022/05/11 Java/Android