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入门教程
Feb 08 Python
Python多线程实例教程
Sep 06 Python
python 读取文件并替换字段的实例
Jul 12 Python
Python import与from import使用及区别介绍
Sep 06 Python
python dict 相同key 合并value的实例
Jan 21 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
Python 转换文本编码实现解析
Aug 27 Python
YUV转为jpg图像的实现
Dec 09 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
python3.6使用SMTP协议发送邮件
May 20 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
JS的数组的扩展实例代码
2008/07/09 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
2015/08/31 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
python在文本开头插入一行的实例
2018/05/02 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
用Python写一个自动木马程序
2019/09/17 Python
Python利用命名空间解析XML文档
2020/08/10 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
会计岗位职责
2013/11/08 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
公司司机岗位职责
2014/02/07 职场文书
调解员先进事迹材料
2014/02/07 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
会计求职简历自我评价
2015/03/10 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
费用申请报告范文
2015/05/15 职场文书
歌舞青春观后感
2015/06/10 职场文书
旷工检讨书大全
2015/08/15 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript