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 时间处理datetime实例
Sep 06 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
Python 使用with上下文实现计时功能
Mar 09 Python
Python3 log10()函数简单用法
Feb 19 Python
flask框架单元测试原理与用法实例分析
Jul 23 Python
python画蝴蝶曲线图的实例
Nov 21 Python
python等待10秒执行下一命令的方法
Jul 19 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
python3中布局背景颜色代码分析
Dec 01 Python
python 模拟登录B站的示例代码
Dec 15 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 Python
python实现会员信息管理系统(List)
Mar 18 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实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
js中判断用户输入的值是否为空的简单实例
2013/12/23 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
有关json_decode乱码及NULL的问题
2015/10/13 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
js实现按钮控制带有停顿效果的图片滚动
2016/08/30 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
Python制作CSDN免积分下载器
2015/03/10 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
高中生学习生活的自我评价
2013/10/09 职场文书
名人演讲稿范文
2013/12/28 职场文书
投资合作协议书
2014/04/17 职场文书
公司担保书格式范文
2014/05/12 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
大学生学习计划书
2014/09/15 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
小学新教师个人总结
2015/02/05 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书