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实现定时同步本机与北京时间的方法
Mar 24 Python
python如何实现远程控制电脑(结合微信)
Dec 21 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
Python 中字符串拼接的多种方法
Jul 30 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
Python中format()格式输出全解
Apr 12 Python
python交易记录整合交易类详解
Jul 03 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 Python
Python使用configparser库读取配置文件
Feb 22 Python
Django ORM filter() 的运用详解
May 14 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 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利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
php array_unique之后json_encode需要注意
2011/01/02 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
Python Series从0开始索引的方法
2018/11/06 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
安全生产专项整治方案
2014/05/06 职场文书
查摆剖析材料范文
2014/09/30 职场文书
员工工作及收入证明
2014/10/28 职场文书
2015年电工工作总结
2015/04/10 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技