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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Python中使用MELIAE分析程序内存占用实例
Feb 18 Python
Python列表生成器的循环技巧分享
Mar 06 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
May 02 Python
python过滤字符串中不属于指定集合中字符的类实例
Jun 30 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
用Python将动态GIF图片倒放播放的方法
Nov 02 Python
python3.5 tkinter实现页面跳转
Jan 30 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
Feb 07 Python
python实现小程序推送页面收录脚本
Apr 20 Python
Python接口测试数据库封装实现原理
May 09 Python
查看keras的默认backend实现方式
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
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php注销代码(session注销)
2012/05/31 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
ECMAScript 基础知识
2007/06/29 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
Bootstrap的Refresh Icon也spin起来
2016/07/13 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
浅谈python之新式类
2018/08/12 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
python 字符串追加实例
2019/07/20 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
台湾森森购物网:U-mall
2017/10/16 全球购物
PHP笔试题
2012/02/22 面试题
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
安全生产汇报材料
2014/02/17 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
预备党员党支部意见
2015/06/02 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
如何写好开幕词?
2019/06/24 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
vue+element ui实现锚点定位
2021/06/29 Vue.js
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS