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操作MySQL数据库具体方法
Oct 28 Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
浅析Python多线程下的变量问题
Apr 28 Python
在Python中操作时间之tzset()方法的使用教程
May 22 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
python实现在cmd窗口显示彩色文字
Jun 24 Python
详细介绍pandas的DataFrame的append方法使用
Jul 31 Python
WxPython实现无边框界面
Nov 18 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
教你用python控制安卓手机
May 13 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 批量删除 sql语句
2009/06/05 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
PHP7常量数组用法分析
2016/09/26 PHP
不用ajax实现点击文字即可编辑的方法
2007/12/16 Javascript
简单的JS多重继承示例
2008/03/13 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
python中精确输出JSON浮点数的方法
2014/04/18 Python
python+opencv实现动态物体识别
2018/01/09 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
Python如何批量生成和调用变量
2020/11/21 Python
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
毕业生求职简历中的自我评价
2013/10/18 职场文书
软件工程师岗位职责
2013/11/16 职场文书
旅游项目开发策划书
2014/01/18 职场文书
建筑总经理岗位职责
2014/02/02 职场文书
家长评语和期望
2014/02/10 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
Redis读写分离搭建的完整步骤
2021/09/14 Redis
Nginx的基本概念和原理
2022/03/21 Servers