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中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
Python多进程并发(multiprocessing)用法实例详解
Jun 02 Python
Python使用pylab库实现画线功能的方法详解
Jun 08 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
python构建指数平滑预测模型示例
Nov 21 Python
Python通过socketserver处理多个链接
Mar 18 Python
Python pandas如何向excel添加数据
May 22 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
一个PHP数组应该有多大的分析
2009/07/30 PHP
PHP XML数据解析代码
2010/05/26 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
Python Requests 基础入门
2016/04/07 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
python线程池threadpool实现篇
2018/04/27 Python
Python中函数参数调用方式分析
2018/08/09 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
params有什么用
2016/03/01 面试题
英语专业毕业生自荐信
2013/10/28 职场文书
初三物理教学反思
2014/01/21 职场文书
暑期社会实践感言
2014/02/25 职场文书
雏鹰争章活动总结
2014/05/09 职场文书
财务负责人任命书
2014/06/06 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
劳动仲裁调解书
2015/05/20 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
Pytorch中的数据集划分&正则化方法
2021/05/27 Python
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js