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 相关文章推荐
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
Python入门_浅谈for循环、while循环
May 16 Python
Python的多维空数组赋值方法
Apr 13 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
Python调用服务接口的实例
Jan 03 Python
基于python生成器封装的协程类
Mar 20 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
python opencv 简单阈值算法的实现
Aug 04 Python
wxpython实现按钮切换界面的方法
Nov 19 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
Python实现byte转integer
Jun 03 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
phpstrom使用xdebug配置方法
2013/12/17 PHP
windows下PHP_intl.dll正确配置方法(apache2.2+php5.3.5)
2014/01/14 PHP
php 邮件发送问题解决
2014/03/22 PHP
设定php简写功能的方法
2019/11/28 PHP
如何在一个页面显示多个百度地图
2013/04/07 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
vue props对象validator自定义函数实例
2019/11/13 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
python对字典进行排序实例
2014/09/25 Python
浅谈Python中数据解析
2015/05/05 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
大学生就业自我鉴定
2013/10/26 职场文书
挑战杯创业计划书的写作指南
2014/01/07 职场文书
毕业生大学生活自我总结
2014/01/31 职场文书
小学教师听课制度
2014/02/01 职场文书
员工入职担保书范文
2014/04/01 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
物业管理交接协议书
2016/03/24 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python
基于python制作简易版学生信息管理系统
2021/04/20 Python
Python编写nmap扫描工具
2021/07/21 Python