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 相关文章推荐
centos下更新Python版本的步骤
Feb 12 Python
Python从MP3文件获取id3的方法
Jun 15 Python
Python数据结构之翻转链表
Feb 25 Python
Python xlwt设置excel单元格字体及格式
Apr 18 Python
Selenium控制浏览器常见操作示例
Aug 13 Python
Python基础教程之异常详解
Jan 10 Python
django模板加载静态文件的方法步骤
Mar 01 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python matplotlib包图像配色方案分享
Mar 14 Python
使用sklearn对多分类的每个类别进行指标评价操作
Jun 11 Python
Python中的pprint模块
Nov 27 Python
Python使用DFA算法过滤内容敏感词
Apr 22 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
通过文字传递创建的图形按钮
2006/10/09 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
python实现图片转字符画的完整代码
2021/02/21 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
HTML5标签使用方法详解
2015/11/27 HTML / CSS
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
创业计划书如何吸引他人眼球
2014/01/10 职场文书
家长给老师的道歉信
2014/01/13 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
安全月活动总结
2014/05/05 职场文书
学校献爱心活动总结
2014/07/08 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2015年护士节活动总结
2015/02/10 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android