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 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
用Python进行简单图像识别(验证码)
Jan 19 Python
Flask框架信号用法实例分析
Jul 24 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
对python借助百度云API对评论进行观点抽取的方法详解
Feb 21 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
python 字符串常用函数详解
Sep 11 Python
python 实现多线程下载视频的代码
Nov 15 Python
Python容器类型公共方法总结
Aug 19 Python
matplotlib grid()设置网格线外观的实现
Feb 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
php模拟登陆的实现方法分析
2015/01/09 PHP
php中ob函数缓冲机制深入理解
2015/08/03 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
Prototype Date对象 学习
2009/07/12 Javascript
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
使用js实现数据格式化
2014/12/03 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
python matlibplot绘制3D图形
2018/07/02 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
2019/12/18 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
keras导入weights方式
2020/06/12 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
公司开业庆典主持词
2014/03/21 职场文书
三年级评语大全
2014/04/23 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
公司市场部岗位职责
2015/04/15 职场文书
生日宴会祝酒词
2015/08/10 职场文书
Python软件包安装的三种常见方法
2022/07/07 Python