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实现栈的方法
May 26 Python
利用python批量给云主机配置安全组的方法教程
Jun 21 Python
Python基于Floyd算法求解最短路径距离问题实例详解
May 16 Python
Python基础学习之时间转换函数用法详解
Jun 18 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
Aug 23 Python
对django layer弹窗组件的使用详解
Aug 31 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
Python Numpy库常见用法入门教程
Jan 16 Python
Python调用C/C++的方法解析
Aug 05 Python
如何用Python编写一个电子考勤系统
Feb 08 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下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
vue.js项目nginx部署教程
2018/04/05 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
Python编程中的异常处理教程
2015/08/21 Python
Python 多进程和数据传递的理解
2017/10/09 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
对numpy.append()里的axis的用法详解
2018/06/28 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
网络管理专业求职信
2014/03/15 职场文书
承诺书模板
2014/08/30 职场文书
业务员辞职信范文
2015/03/02 职场文书
小孩不笨观后感
2015/06/03 职场文书
李强为自己工作观后感
2015/06/11 职场文书
车间班组长竞聘书
2015/09/15 职场文书
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
python保存图片的四个常用方法
2022/02/28 Python
Elasticsearch 批量操作
2022/04/19 Python
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL