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 Python2 升级到Python3的简单实现
Jun 21 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
python操作mysql数据库
Mar 05 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
python实现windows壁纸定期更换功能
Jan 21 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
opencv检测动态物体的实现
Jul 21 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
PHP 翻页 实例代码
2009/08/07 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
python使用pil生成图片验证码的方法
2015/05/08 Python
Python实现telnet服务器的方法
2015/07/10 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
python如何将多个PDF进行合并
2019/08/13 Python
Python gevent协程切换实现详解
2020/09/14 Python
python中字符串的编码与解码详析
2020/12/03 Python
python压包的概念及实例详解
2021/02/17 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
关于礼仪的演讲稿
2014/01/04 职场文书
护士自我评价
2014/02/01 职场文书
股票投资建议书
2014/05/19 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
教师辞职书范文
2015/02/26 职场文书
在职证明范本
2015/06/15 职场文书
清明节主题班会
2015/08/14 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫