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 动态获取当前运行的类名和函数名的方法
Apr 15 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
Python Socket传输文件示例
Jan 16 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
Python类装饰器实现方法详解
Dec 21 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
python pygame实现方向键控制小球
May 17 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
python能自学吗
Jun 18 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 Python
python爬虫利用代理池更换IP的方法步骤
Feb 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管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
php根据某字段对多维数组进行排序的方法
2015/03/07 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
js对象的比较
2011/02/26 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
windows下python连接oracle数据库
2017/06/07 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
详解Python实现进度条的4种方式
2020/01/15 Python
Python实现不规则图形填充的思路
2020/02/02 Python
Python持续监听文件变化代码实例
2020/07/22 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
美国经典刺绣和字母儿童服装特卖:Smocked Auctions
2018/07/16 全球购物
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
生产班组长岗位职责
2014/01/05 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
环保标语大全
2014/06/12 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js