Python多进程通信Queue、Pipe、Value、Array实例


Posted in Python onNovember 21, 2014

queue和pipe的区别: pipe用来在两个进程间通信。queue用来在多个进程间实现通信。 此两种方法为所有系统多进程通信的基本方法,几乎所有的语言都支持此两种方法。

1)Queue & JoinableQueue

queue用来在进程间传递消息,任何可以pickle-able的对象都可以在加入到queue。

multiprocessing.JoinableQueue 是 Queue的子类,增加了task_done()和join()方法。

task_done()用来告诉queue一个task完成。一般地在调用get()获得一个task,在task结束后调用task_done()来通知Queue当前task完成。

join() 阻塞直到queue中的所有的task都被处理(即task_done方法被调用)。

代码:

import multiprocessing

import time
class Consumer(multiprocessing.Process):

    

    def __init__(self, task_queue, result_queue):

        multiprocessing.Process.__init__(self)

        self.task_queue = task_queue

        self.result_queue = result_queue
    def run(self):

        proc_name = self.name

        while True:

            next_task = self.task_queue.get()

            if next_task is None:

                # Poison pill means shutdown

                print ('%s: Exiting' % proc_name)

                self.task_queue.task_done()

                break

            print ('%s: %s' % (proc_name, next_task))

            answer = next_task() # __call__()

            self.task_queue.task_done()

            self.result_queue.put(answer)

        return


class Task(object):

    def __init__(self, a, b):

        self.a = a

        self.b = b

    def __call__(self):

        time.sleep(0.1) # pretend to take some time to do the work

        return '%s * %s = %s' % (self.a, self.b, self.a * self.b)

    def __str__(self):

        return '%s * %s' % (self.a, self.b)


if __name__ == '__main__':

    # Establish communication queues

    tasks = multiprocessing.JoinableQueue()

    results = multiprocessing.Queue()

    

    # Start consumers

    num_consumers = multiprocessing.cpu_count()

    print ('Creating %d consumers' % num_consumers)

    consumers = [ Consumer(tasks, results)

                  for i in range(num_consumers) ]

    for w in consumers:

        w.start()

    

    # Enqueue jobs

    num_jobs = 10

    for i in range(num_jobs):

        tasks.put(Task(i, i))

    

    # Add a poison pill for each consumer

    for i in range(num_consumers):

        tasks.put(None)
    # Wait for all of the tasks to finish

    tasks.join()

    

    # Start printing results

    while num_jobs:

        result = results.get()

        print ('Result:', result)

        num_jobs -= 1

注意小技巧: 使用None来表示task处理完毕。

运行结果:

Python多进程通信Queue、Pipe、Value、Array实例

2)pipe

pipe()返回一对连接对象,代表了pipe的两端。每个对象都有send()和recv()方法。

代码:

from multiprocessing import Process, Pipe
def f(conn):

    conn.send([42, None, 'hello'])

    conn.close()
if __name__ == '__main__':

    parent_conn, child_conn = Pipe()

    p = Process(target=f, args=(child_conn,))

    p.start()

    p.join()

    print(parent_conn.recv())   # prints "[42, None, 'hello']"

3)Value + Array

Value + Array 是python中共享内存 映射文件的方法,速度比较快。

from multiprocessing import Process, Value, Array
def f(n, a):

    n.value = n.value + 1

    for i in range(len(a)):

        a[i] = a[i] * 10
if __name__ == '__main__':

    num = Value('i', 1)

    arr = Array('i', range(10))
    p = Process(target=f, args=(num, arr))

    p.start()

    p.join()
    print(num.value)

    print(arr[:])

    

    p2 = Process(target=f, args=(num, arr))

    p2.start()

    p2.join()
    print(num.value)

    print(arr[:])
# the output is :

# 2

# [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

# 3

# [0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
Python 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
手动实现把python项目发布为exe可执行程序过程分享
Oct 23 Python
Python中的模块和包概念介绍
Apr 13 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
浅谈Python对内存的使用(深浅拷贝)
Jan 17 Python
python 读取摄像头数据并保存的实例
Aug 03 Python
详解用Python实现自动化监控远程服务器
May 18 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
Django models文件模型变更错误解决
May 11 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
python requests模块的使用示例
Apr 07 Python
python用海龟绘图写贪吃蛇游戏
Jun 18 Python
Python多进程同步Lock、Semaphore、Event实例
Nov 21 #Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 #Python
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 #Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 #Python
Python实现的下载8000首儿歌的代码分享
Nov 21 #Python
Python常用模块介绍
Nov 21 #Python
Python使用py2exe打包程序介绍
Nov 20 #Python
You might like
Ajax PHP简单入门教程代码
2008/04/25 PHP
php中计算时间差的几种方法
2009/12/31 PHP
php中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
PHP编写的图片验证码类文件分享
2016/06/06 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
[01:54]胎教DOTA2 准妈妈玩家现身中国区预选赛
2016/06/26 DOTA
python实现员工管理系统
2018/01/11 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
python机器学习之神经网络实现
2018/10/13 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
外语系毕业生找工作的求职信
2013/11/28 职场文书
物流合作计划书
2014/01/10 职场文书
超市重阳节活动方案
2014/02/10 职场文书
师德模范事迹材料
2014/06/03 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
初一数学教学反思
2016/02/17 职场文书
Go语言编译原理之源码调试
2022/08/05 Golang