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 urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
Python解析nginx日志文件
May 11 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
详谈python3 numpy-loadtxt的编码问题
Apr 29 Python
Python实现快速计算词频功能示例
Jun 25 Python
python处理两种分隔符的数据集方法
Dec 12 Python
PyQt5+requests实现车票查询工具
Jan 21 Python
深入浅析python的第三方库pandas
Feb 13 Python
Python 炫技操作之合并字典的七种方法
Apr 10 Python
MATLAB 如何求取离散点的曲率最大值
Apr 16 Python
Python基础之函数嵌套知识总结
May 23 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 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+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
JavaScript中的Document文档对象
2008/01/16 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
python实现的阳历转阴历(农历)算法
2014/04/25 Python
Python赋值语句后逗号的作用分析
2015/06/08 Python
Python 多线程实例详解
2017/03/25 Python
Python操作MongoDB详解及实例
2017/05/18 Python
python opencv如何实现图片绘制
2020/01/19 Python
python 递归相关知识总结
2021/03/03 Python
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
土木工程应届生自荐信
2013/09/24 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
管理建议书范文
2014/05/13 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
迟到检讨书范文
2015/01/27 职场文书
消防验收申请报告
2015/05/15 职场文书
家长意见书
2015/06/04 职场文书
销售会议开幕词
2016/03/04 职场文书