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 获取本机ip地址的两个方法
Feb 25 Python
python基础教程之循环介绍
Aug 29 Python
python使用PyGame绘制图像并保存为图片文件的方法
Apr 24 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
Python实现批量检测HTTP服务的状态
Oct 27 Python
Python内置函数delattr的具体用法
Nov 23 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
Aug 30 Python
python 字典的打印实现
Sep 26 Python
python配置文件写入过程详解
Oct 19 Python
python3 tcp的粘包现象和解决办法解析
Dec 09 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 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投票系统的设计和实现分享
2012/09/23 PHP
PHP分页类集锦
2014/11/18 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
php封装的page分页类完整实例
2016/10/18 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
Python3读取zip文件信息的方法
2015/05/22 Python
12步教你理解Python装饰器
2016/02/25 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
Python 字符串大小写转换的简单实例
2017/01/21 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
Python用户自定义异常的实现
2020/12/25 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
银行员工考核评语
2014/12/31 职场文书
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫