python进程间通信Queue工作过程详解_python

来源:脚本之家  责任编辑:小易  

从web应用中添加过来的(上面省略了bottle的代码),开了一个进程,不断从queue中读取数据,并进行处理(省略了处理过程)。逻辑是没错的,但是在实际测试的时候,发现一个问题www.zgxue.com防采集请勿采集本网。

Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。

路径不要自己拼接,容易出错: import os import time from multiprocessing import Pool,Manager,cpu_count def copy(file_name,old_folder,new_folder,queue): print(os.path.join(old_folder,

1. Queue的使用

的错误,查了下,大意是队列对象不能在父进程与子进程间通信,这个如果想要使用进程池中使用队列则要使用multiprocess的Manager类 if_name_='_main_': manager=multiprocessing.Manager() 父进程创建Queue

可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理:

这个是多进程并发的Queue队列,用于解决多进程间的通信问题。普通Queue实现不了。例如来跑多进程对一批IP列表进行运算,运算后的结果都存到Queue队列里面,这个就必须使用multiprocessing提供的Queue来

import multiprocessingq = multiprocessing.Queue(3) # 初始化的Queue对象,最多能put三条消息q.put("消息1")q.put("消息2")print(q.full())q.put("消息3")print(q.full())# 因为消息列队已满下面的try都会抛出异常,第一个try会等待2秒后再抛出异常,第二个Try会立刻抛出异常try: q.put("消息4", True, 2)except: print("消息已满,现有的消息为%d" % (q.qsize()))try: q.put_nowait("消息4")except: print("消息已满,现有的消息为%d" % (q.qsize()))# 推荐的方式,先判断消息列队是否已满,再写入if not q.full(): q.put_nowait("消息4")# 读取消息时,先判断消息列队是否为空,再读取if not q.empty(): for i in range(q.qsize()): print(q.get_nowait())

import multiprocessing import Queue import time def test_thread(que,name): while not que.empty(): try: s=que.get(timeout=0) print\"%s:%s\"%(name,s) time.sleep(5) except Queue.Empty:

运行结果:

Queue.Queue 是进程内非阻塞队列 multiprocess.Queue 是跨进程通信队列 前者是各自进程私有,后者是各子进程共有 Manager 是 multiprocessing 的封装.Manager.Queue 和 Queue,multiprocessing.

FalseTrue消息已满,现有的消息为3消息已满,现有的消息为3消息1消息2消息3

说明:

初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头); Queue.qsize():返回当前队列包含的消息数量; Queue.empty():如果队列为空,返回True,反之False ; Queue.full():如果队列满了,返回True,反之False; Queue.get([block[, timeout]]):获取队列中的一条消息,然后将其从列队中移除,block默认值为True

1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为止,如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出"Queue.Empty"异常;

2)如果block值为False,消息列队如果为空,则会立刻抛出"Queue.Empty"异常; Queue.get_nowait():相当Queue.get(False); Queue.put(item,[block[, timeout]]):将item消息写入队列,block默认值为True;

1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出"Queue.Full"异常;

2)如果block值为False,消息列队如果没有空间可写入,则会立刻抛出"Queue.Full"异常;

Queue.put_nowait(item):相当Queue.put(item, False);

2. Queue实例

我们以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

import multiprocessingimport timeimport randomdef write(q): """忘队列中写入数据""" for value in "ABCD": print("Put %s to queue" % (value)) q.put(value) time.sleep(random.random())def read(q): """读取队列中的数据""" while True: if not q.empty(): value = q.get(True) print("Get %s from queue" % (value)) time.sleep(random.random()) else: breakif __name__ == "__main__": q = multiprocessing.Queue() pw = multiprocessing.Process(target=write, args=(q,)) pr = multiprocessing.Process(target=read, args=(q,)) pw.start() pw.join() pr.start() pr.join() print('') print('所有数据都写入并且读完')

运行结果:

Queue.Queue 是进程内非阻塞队列 multiprocess.Queue 是跨进程通信队列 前者是各自进程私有,后者是各子进程共有 Manager 是 multiprocessing 的封装.Manager.Queue 和 Queue,multiprocessing.

Put A to queuePut B to queuePut C to queuePut D to queueGet A from queueGet B from queueGet C from queueGet D from queue所有数据都写入并且读完

python进程间通信queue 是消息队列在2.6才开始使用multiprocessing 是一个使用方法类似threading模块的进程模块。允许程序员做并行开发。并且可以在UNIX和Windows下运行。通过创建一个Process 类型并且通过调用call()方法spawn一个进程。一个比较简单的例子:usr/bin/env pythonfrom multiprocessing import Processimport timedef f(name):time.sleep(1)print 'hello ',nameprint os.getppid()#取得父进程IDprint os.getpid()#取得进程IDprocess_list=[]if_name_='_main_':for i in range(10):p=Process(target=f,args=(i,))p.start()process_list.append(p)for j in process_list:j.join()内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • python多进程通信queue、pipe、value、array实例
  • python进程间通信 multiprocessing queue队列实现详解
  • python进程间通信queue实例解析
  • python进程间通信queue消息队列用法分析
  • python实现进程间通信简单实例
  • python 多进程通信模块的简单实现
  • python进程间通信之共享内存详解
  • python多进程实现进程间通信实例
  • python执行子进程实现进程间通信的方法
  • python进程通信之匿名管道实例讲解
  • python进程的通信queue、pipe实例分析
  • python shapely使用指南详解
  • python实现读写ini配置文件的方法示例
  • tensorflow: variable的值与variable.read_value()的值区别详解
  • 浅谈matplotlib简介和pyplot的简单使用——文本标注和箭头
  • python松散正则表达式用法分析
  • 对python中字典keys,values,items的使用详解
  • python将字符串以utf-8格式保存在txt文件中的方法
  • python中变量交换的例子
  • 基于python安装pyecharts所遇的问题及解决方法
  • python3.x对json的一些操作示例
  • python进程间通信queue 是消息队列吗
  • python进程间通信queue 是消息队列吗
  • python进程间通信怎么理解
  • Python进程间通信问题(多进程读写问题)
  • python Pool进程池 用Manager().Queue()通信 主进程却无法get到Queue里的数据 不知道为什么?
  • python多进程中队列不空时阻塞,求解为什么
  • Python multiprocessing.Queue 和 Queue有区别吗
  • python 进程间怎么共享内存 请给个实例
  • python 中的三种 Queue 有什么区别
  • 几种进程间的常用通信方式
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全vbsdos/bathtahtcpythonperl游戏相关vba远程脚本coldfusionruby专题autoitseraphzonepowershelllinux shellluagolangerlang其它首页pythonpython多进程通信queue、pipe、value、array实例python进程间通信 multiprocessing queue队列实现详解python进程间通信queue实例解析python进程间通信queue消息队列用法分析python实现进程间通信简单实例python 多进程通信模块的简单实现python进程间通信之共享内存详解python多进程实现进程间通信实例python执行子进程实现进程间通信的方法python进程通信之匿名管道实例讲解python进程的通信queue、pipe实例分析python shapely使用指南详解python实现读写ini配置文件的方法示例tensorflow: variable的值与variable.read_value()的值区别详解浅谈matplotlib简介和pyplot的简单使用——文本标注和箭头python松散正则表达式用法分析对python中字典keys,values,items的使用详解python将字符串以utf-8格式保存在txt文件中的方法python中变量交换的例子基于python安装pyecharts所遇的问题及解决方法python3.x对json的一些操作示例python入门教程 超详细1小时学会python 列表(list)操作方法详解python 元组(tuple)操作详解python 字典(dictionary)操作详解pycharm 使用心得(一)安装和首python strip()函数 介绍python 中文乱码问题深入分析python科学计算环境推荐——anacpython逐行读取文件内容的三种方python中使用xlrd、xlwt操作excepython opencv实现证件照换底功能python math库 ln(x)运算的实现及原理opencv+python手势识别框架和实例讲解python 使用opencv 把视频分割成图片示例python3利用print输出带颜色的彩色字体示python实现数通设备tftp备份配置文件示例python实现通过继承覆盖方法示例python selenium 获取标签的属性值、内容python使用matplotlib绘制余弦的散点图示pytorch 把mnist数据集转换成图片和txt的
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved