当前位置: 首页 > news >正文

python 学习笔记 - Queue Pipes,进程间通讯

上面写了Python如何创建多个进程,但是前面文章中创建的进程都是哑巴和聋子,自己顾自己执行,不会相互交流。
那么如何让进程间相互说说话呢?
Python为我们提供了一个函数multiprocessing.Pipe
和一个类:multiprocessing.Queue。

multiprocessing.Pipe()

multiprocessing.Pipe()即管道模式,调用Pipe()返回管道的两端的Connection。

Python官方文档的描述:
Returns a pair (conn1, conn2) of Connection objects representing the ends of a pipe.

因此, Pipe仅仅适用于只有两个进程一读一写的单双工情况,也就是说信息是只向一个方向流动。例如电视、广播,看电视的人只能看,电视台是能播送电视节目。

Pipe的读写效率要高于Queue。
进程间的Pipe基于fork机制建立。
当主进程创建Pipe的时候,Pipe的两个Connections连接的的都是主进程。
当主进程创建子进程后,Connections也被拷贝了一份。此时有了4个Connections。
此后,关闭主进程的一个Out Connection,关闭一个子进程的一个In Connection。那么就建立好了一个输入在主进程,输出在子进程的管道。
原理示意图如下:
Pipe原理示意图
跟多资料可以阅读:http://www.tuicool.com/articl...

# 示例代码
# coding=utf-8
from multiprocessing import Pipe, Process


def son_process(x, pipe):
    _out_pipe, _in_pipe = pipe

    # 关闭fork过来的输入端
    _in_pipe.close()
    while True:
        try:
            msg = _out_pipe.recv()
            print msg
        except EOFError:
            # 当out_pipe接受不到输出的时候且输入被关闭的时候,会抛出EORFError,可以捕获并且退出子进程
            break


if __name__ == '__main__':
    out_pipe, in_pipe = Pipe(True)
    son_p = Process(target=son_process, args=(100, (out_pipe, in_pipe)))
    son_p.start()

    # 等pipe被fork 后,关闭主进程的输出端
    # 这样,创建的Pipe一端连接着主进程的输入,一端连接着子进程的输出口
    out_pipe.close()
    for x in range(1000):
        in_pipe.send(x)
    in_pipe.close()
    son_p.join()
    print "主进程也结束了"

总结一下:

  • 上面的代码中主要用到了pipe的send()、recv()、close()方法。当pipe的输入端被关闭,且无法接收到输入的值,那么就会抛出EOFError。

  • 新建一个Pipe(duplex)的时候,如果duplex为True,那么创建的管道是双向的;如果duplex为False,那么创建的管道是单向的。

multiprocessing.Queue

Queue据官方文档也是基于pipe的实现。
Queue的使用主要是一边put(),一边get().但是Queue可以是多个Process 进行put操作,也可以是多个Process进行get()操作。
Demo:

# coding=utf-8
from multiprocessing import Queue, Process
from Queue import Empty as QueueEmpty
import random


def getter(name, queue):
    print 'Son process %s' % name
    while True:
        try:
            value = queue.get(True, 10)
            # block为True,就是如果队列中无数据了。
            #   |—————— 若timeout默认是None,那么会一直等待下去。
            #   |—————— 若timeout设置了时间,那么会等待timeout秒后才会抛出Queue.Empty异常
            # block 为False,如果队列中无数据,就抛出Queue.Empty异常
            print "Process getter get: %f" % value
        except QueueEmpty:
            break


def putter(name, queue):
    print "Son process %s" % name
    for i in range(0, 1000):
        value = random.random()
        queue.put(value)
        # 放入数据 put(obj[, block[, timeout]])
        # 若block为True,如队列是满的:
        #  |—————— 若timeout是默认None,那么就会一直等下去
        #  |—————— 若timeout设置了等待时间,那么会等待timeout秒后,如果还是满的,那么就抛出Queue.Full.
        # 若block是False,如果队列满了,直接抛出Queue.Full
        print "Process putter put: %f" % value


if __name__ == '__main__':
    queue = Queue()
    getter_process = Process(target=getter, args=("Getter", queue))
    putter_process = Process(target=putter, args=("Putter", queue))
    getter_process.start()
    putter_process.start()

Queue的一些说明已经写在代码中了。

相关文章:

  • 带KEY的SCP命令,老是要查,这次写在这里吧,
  • 深入理解Java的接口和抽象类
  • C语言例题系列-------第一天
  • 使用awk统计字段重复实践
  • select自定义小三角样式
  • Shell判断输入是否有效IP和字母
  • InnoDB的B+树索引
  • C/C++内存划分
  • sysbench_memory
  • 今天开始学Pattern Recognition and Machine Learning (PRML),章节5.2-5.3,Neural Networks神经网络训练(BP算法)...
  • cd命令无效
  • SAMBA文件共享服务器
  • Centos 常用命令
  • 禅道项目管理软件
  • 网页视口内广告浮动弹窗
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 《剑指offer》分解让复杂问题更简单
  • Android优雅地处理按钮重复点击
  • Consul Config 使用Git做版本控制的实现
  • DataBase in Android
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Fundebug计费标准解释:事件数是如何定义的?
  • Git 使用集
  • java 多线程基础, 我觉得还是有必要看看的
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • log4j2输出到kafka
  • Python学习之路16-使用API
  • text-decoration与color属性
  • ubuntu 下nginx安装 并支持https协议
  • 阿里云购买磁盘后挂载
  • 程序员该如何有效的找工作?
  • 给初学者:JavaScript 中数组操作注意点
  • 一个项目push到多个远程Git仓库
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 自动记录MySQL慢查询快照脚本
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #define与typedef区别
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (八)Spring源码解析:Spring MVC
  • (六)vue-router+UI组件库
  • (七)Java对象在Hibernate持久化层的状态
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (小白学Java)Java简介和基本配置
  • (转)http协议
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)虚函数剖析
  • .a文件和.so文件
  • .Mobi域名介绍
  • .net 按比例显示图片的缩略图
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法