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 fileinput模块使用介绍
Nov 30 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
Python实现的基于优先等级分配糖果问题算法示例
Apr 25 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
对Python函数设计规范详解
Jul 19 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 Python
python数字转对应中文的方法总结
Aug 02 Python
Python3的进程和线程你了解吗
Mar 16 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 Hash函数,增强密码安全
2011/02/25 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
php实现计数器方法小结
2015/01/05 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
解析Javascript小括号“()”的多义性
2013/12/03 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
再谈JavaScript线程
2015/07/10 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
python中去空格函数的用法
2014/08/21 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
积极贯彻学习两会精神总结
2014/03/17 职场文书
房屋公证委托书
2014/04/03 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
资金申请报告范文
2015/05/14 职场文书
归途列车观后感
2015/06/17 职场文书
财务年终工作总结大全
2019/06/20 职场文书