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实现简单遗传算法(SGA)
Jan 29 Python
Python单元测试实例详解
May 25 Python
python实现超市扫码仪计费
May 30 Python
Python中的CSV文件使用"with"语句的方式详解
Oct 16 Python
对Python捕获控制台输出流的方法详解
Jan 07 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
numpy 返回函数的上三角矩阵实例
Nov 25 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
Python Unittest原理及基本使用方法
Nov 06 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 Python
如何使用Python实现一个简易的ORM模型
May 12 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
PHP 地址栏信息的获取代码
2009/01/07 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
2015/12/19 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
vue2.0全局组件之pdf详解
2017/06/26 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
Python自动扫雷实现方法
2015/07/25 Python
python多线程之事件Event的使用详解
2018/04/27 Python
python实现textrank关键词提取
2018/06/22 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
互动出版网:专业书籍
2017/03/21 全球购物
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
新年寄语大全
2014/04/12 职场文书
2014财务年终工作总结
2014/12/08 职场文书