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 相关文章推荐
深入理解NumPy简明教程---数组2
Dec 17 Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 Python
Django中cookie的基本使用方法示例
Feb 03 Python
Python实现求两个数组交集的方法示例
Feb 23 Python
使用Python为中秋节绘制一块美味的月饼
Sep 11 Python
Python传递参数的多种方式(小结)
Sep 18 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
python使用建议与技巧分享(一)
Aug 17 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
Python 多进程原理及实现
Dec 21 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 26 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 缓存函数代码
2008/08/27 PHP
php学习笔记之 函数声明(二)
2011/06/09 PHP
深入PHP FTP类的详解
2013/06/13 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
Javascript的闭包
2009/12/31 Javascript
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
ES6的异步终极解决方案分享
2019/07/11 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
使用Python实现一个简单的项目监控
2015/03/31 Python
python异常和文件处理机制详解
2016/07/19 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
Python File readlines() 使用方法
2018/03/19 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
django的model操作汇整详解
2019/07/26 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
大学本科毕业生求职信范文
2013/12/18 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
小学五年级学生评语
2014/04/22 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏