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正常时间和unix时间戳相互转换的方法
Apr 23 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
对numpy中数组元素的统一赋值实例
Apr 04 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
Dec 20 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
Python实现打砖块小游戏代码实例
May 18 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
Python实现搜索算法的实例代码
Jan 02 Python
python add_argument()用法解析
Jan 29 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
Python生成器generator原理及用法解析
Jul 20 Python
详解如何修改python中字典的键和值
Sep 29 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
Protoss魔法科技
2020/03/14 星际争霸
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
2016/12/10 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
动态加载iframe
2006/06/16 Javascript
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
动态加载js、css的实例代码
2016/05/26 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
实例讲解python函数式编程
2014/06/09 Python
Python中的choice()方法使用详解
2015/05/15 Python
用Python编写简单的微博爬虫
2016/03/04 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
Python如何对齐字符串
2020/07/30 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
见习期自我鉴定
2014/01/31 职场文书
进步之星获奖感言
2014/02/22 职场文书
幼儿园三八妇女节活动方案
2014/03/11 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
Java并发编程必备之Future机制
2021/06/30 Java/Android
Python集合set()使用的方法详解
2022/03/18 Python