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的格式化输出(format,%)实例详解
Jun 01 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
python pip源配置,pip配置文件存放位置的方法
Jul 12 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
python 实现生成均匀分布的点
Dec 05 Python
Python属性和内建属性实例解析
Jan 14 Python
python如何判断IP地址合法性
Apr 05 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
Nov 11 Python
Python使用windows设置定时执行脚本
Nov 12 Python
python 基于opencv实现高斯平滑
Dec 18 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 07 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_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
JavaScript的目的分析
2007/01/05 Javascript
js脚本实现数据去重
2014/11/27 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
全面解析Vue中的$nextTick
2020/12/24 Vue.js
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
详解Django中的form库的使用
2015/07/18 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
python 实现音频叠加的示例
2020/10/29 Python
大学应届毕业生个人求职信
2013/09/23 职场文书
开业庆典邀请函
2014/01/08 职场文书
yy司仪主持词
2014/03/22 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
JavaScript实现队列结构过程
2021/12/06 Javascript
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js