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 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
Python实现的Excel文件读写类
Jul 30 Python
独特的python循环语句
Nov 20 Python
Python 数据结构之队列的实现
Jan 22 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
python实现五子棋游戏
Jun 18 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
解决Keras中CNN输入维度报错问题
Jun 29 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
Python实现天气查询软件
Jun 07 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 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摘要生成函数(无乱码)
2012/02/04 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
nodejs获取微信小程序带参数二维码实现代码
2017/04/12 NodeJs
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
python实现机器学习之元线性回归
2018/09/06 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
Internal修饰符有什么含义
2013/07/10 面试题
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
MYSQL基础面试题
2012/05/13 面试题
团队精神演讲稿
2013/12/31 职场文书
简历中的自我评价怎么写
2014/01/29 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
幼儿园秋季开学寄语
2014/08/02 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
公安派出所所长四风问题个人对照检查材料
2014/10/04 职场文书
python数字图像处理:图像的绘制
2022/06/28 Python