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中的super用法详解
May 28 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
Python队列的定义与使用方法示例
Jun 24 Python
Python 模拟登陆的两种实现方法
Aug 10 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
详解python深浅拷贝区别
Jun 24 Python
详解使用Python下载文件的几种方法
Oct 13 Python
Python urlopen()和urlretrieve()用法解析
Jan 07 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
python数据处理——对pandas进行数据变频或插值实例
Apr 22 Python
python如何求100以内的素数
May 27 Python
Python extract及contains方法代码实例
Sep 11 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
拼音码表的生成
2006/10/09 PHP
PHP实现把数字ID转字母ID
2013/08/12 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
python-视频分帧&多帧合成视频实例
2019/12/10 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
护士个人简历自荐信
2013/10/18 职场文书
贷款担保书范文
2014/05/13 职场文书
外贸会计专业自荐信
2014/06/22 职场文书
欢度春节标语
2014/07/01 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
高三毕业评语
2014/12/31 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
详解Python函数print用法
2021/06/18 Python
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL