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对字典进行排序实例
Sep 25 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
分享一个简单的python读写文件脚本
Nov 25 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
浅析python内置模块collections
Nov 15 Python
解决pip install psycopg2出错问题
Jul 09 Python
Python字符串及文本模式方法详解
Sep 10 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 Python
Python自动化工具之实现Excel转Markdown表格
Apr 08 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
全国中波电台频率表
2020/03/11 无线电
在WIN98下以apache模块方式安装php
2006/10/09 PHP
php设计模式 Strategy(策略模式)
2011/06/26 PHP
php中JSON的使用与转换
2015/01/14 PHP
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
python编码最佳实践之总结
2016/02/14 Python
Python注释详解
2016/06/01 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
Python中turtle库的使用实例
2019/09/09 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
python数据化运营的重要意义
2019/11/25 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
python字典的值可以修改吗
2020/06/29 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
信访稳定工作汇报
2014/10/27 职场文书
发布会邀请函
2015/01/31 职场文书
西安大雁塔导游词
2015/02/10 职场文书
高中数学教学反思范文
2016/02/18 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle