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常用模块介绍
Nov 21 Python
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
详解Python基础random模块随机数的生成
Mar 23 Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
python 使用建议与技巧分享(四)
Aug 18 Python
Django Form常用功能及代码示例
Oct 13 Python
Python list和str互转的实现示例
Nov 16 Python
如何在C++中调用Python
May 21 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生成和获取XML格式数据的方法
2016/03/04 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
AngularJS实现网站换肤实例
2021/02/19 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python通过文件头判断文件类型
2015/10/30 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
python+VTK环境搭建及第一个简单程序代码
2017/12/13 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
越南综合购物网站:Lazada越南
2019/06/10 全球购物
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
医学生自荐信
2013/12/03 职场文书
主管会计岗位责任制
2014/02/10 职场文书
协会周年庆活动方案
2014/08/26 职场文书
2014年法院工作总结
2014/11/24 职场文书
500字小学生检讨书
2015/02/19 职场文书
入党积极分子个人总结
2015/03/02 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
基于Python实现西西成语接龙小助手
2022/08/05 Golang