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


Posted in Python onNovember 01, 2019

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

1. Queue的使用

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

import multiprocessing

q = 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())

运行结果:

False
True
消息已满,现有的消息为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 multiprocessing
import time
import random


def 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:
            break


if __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('所有数据都写入并且读完')

运行结果:

Put A to queue
Put B to queue
Put C to queue
Put D to queue
Get A from queue
Get B from queue
Get C from queue
Get D from queue

所有数据都写入并且读完

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的解析crontab配置文件代码
Jun 30 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
python创建列表并给列表赋初始值的方法
Jul 28 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
python类的继承实例详解
Mar 30 Python
Python之py2exe打包工具详解
Jun 14 Python
python入门前的第一课 python怎样入门
Mar 06 Python
Python 实现在文件中的每一行添加一个逗号
Apr 29 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 Python
如何用python识别滑块验证码中的缺口
Apr 01 Python
通过实例了解python property属性
Nov 01 #Python
python装饰器练习题及答案
Nov 01 #Python
Django框架HttpRequest对象用法实例分析
Nov 01 #Python
Django框架HttpResponse对象用法实例分析
Nov 01 #Python
Django框架序列化与反序列化操作详解
Nov 01 #Python
redis数据库及与python交互用法简单示例
Nov 01 #Python
python验证码图片处理(二值化)
Nov 01 #Python
You might like
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
nodejs教程之入门
2014/11/21 NodeJs
jQuery中:submit选择器用法实例
2015/01/03 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
调试Python程序代码的几种方法总结
2015/04/28 Python
TensorFlow实现卷积神经网络CNN
2018/03/09 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
python super用法及原理详解
2020/01/20 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
个人委托书范文
2015/01/28 职场文书
婚宴新娘致辞
2015/07/28 职场文书
pycharm代码删除恢复的方法
2021/06/26 Python
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers