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 相关文章推荐
python网络编程之读取网站根目录实例
Sep 30 Python
Python入门篇之条件、循环
Oct 17 Python
Python处理json字符串转化为字典的简单实现
Jul 07 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
利用python-docx模块写批量生日邀请函
Aug 26 Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
什么是Python变量作用域
Jun 03 Python
浅析Python迭代器的高级用法
Jul 16 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 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/10/29 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
JavaScript对象属性检查、增加、删除、访问操作实例
2015/07/08 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
JS处理一些简单计算题
2018/02/24 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
Python中的fileinput模块的简单实用示例
2015/07/09 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
python实现用户登录系统
2016/05/21 Python
python3.4实现邮件发送功能
2018/05/28 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
小学生光盘行动倡议书
2015/04/28 职场文书
保姆聘用合同
2015/09/21 职场文书
小学数学教师研修日志
2015/11/13 职场文书
2016年第二十届“母亲节暨幸福工程救助贫困母亲活动日”活动总结
2016/04/06 职场文书
Python 制作自动化翻译工具
2021/04/25 Python
python之json文件转xml文件案例讲解
2021/08/07 Python
使用javascript解析二维码的三种方式
2021/11/11 Javascript
详解Vue slot插槽
2021/11/20 Vue.js
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis