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使用Flask框架获取用户IP地址的方法
Mar 21 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
Django中处理出错页面的方法
Jul 15 Python
遍历python字典几种方法总结(推荐)
Sep 11 Python
django model去掉unique_together报错的解决方案
Oct 18 Python
使用tensorflow实现线性svm
Sep 07 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
Python读写文件基础知识点
Jun 10 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
如何在C++中调用Python
May 21 Python
python之json文件转xml文件案例讲解
Aug 07 Python
Python 图片添加美颜效果
Apr 28 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 冒泡排序算法的实现代码
2010/08/08 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
javascript new 需不需要继续使用
2009/07/02 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
angularjs自定义过滤器demo示例
2019/08/24 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
浅析Python与Mongodb数据库之间的操作方法
2019/07/01 Python
Django Rest framework频率原理与限制
2019/07/26 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
python模块常用用法实例详解
2019/10/17 Python
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
大学生个人实习的自我评价
2014/02/15 职场文书
工厂车间标语
2014/06/19 职场文书
2014年统计工作总结
2014/11/21 职场文书
学雷锋倡议书
2015/01/19 职场文书
同学聚会通知短信
2015/04/20 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
Vue elementUI表单嵌套表格并对每行进行校验详解
2022/02/18 Vue.js
python保存图片的四个常用方法
2022/02/28 Python