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中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
Python调用微信公众平台接口操作示例
Jul 08 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
May 31 Python
pandas 转换成行列表进行读取与Nan处理的方法
Oct 30 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
python的移位操作实现详解
Aug 21 Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
django迁移文件migrations的实现
Mar 31 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 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计算两个文件相对路径的方法
2015/03/14 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
2012/10/11 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
python实现通过shelve修改对象实例
2014/09/26 Python
python:socket传输大文件示例
2017/01/18 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
英国著名药妆店:Superdrug
2021/02/13 全球购物
介绍一下XMLHttpRequest对象
2012/02/12 面试题
大学毕业生自荐书怎么写?
2014/01/06 职场文书
十佳家长事迹材料
2014/08/26 职场文书
网络营销计划
2015/01/17 职场文书
离婚协议书格式
2015/01/26 职场文书
邀请函怎么写
2015/01/30 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
工作失职自我检讨书
2015/05/05 职场文书
拖欠货款起诉状
2015/05/20 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL