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的高级Git库 Gittle
Sep 22 Python
python 默认参数问题的陷阱
Feb 29 Python
使用Python实现windows下的抓包与解析
Jan 15 Python
详解python之协程gevent模块
Jun 14 Python
opencv3/python 鼠标响应操作详解
Dec 11 Python
屏蔽Django admin界面添加按钮的操作
Mar 11 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
Python configparser模块应用过程解析
Aug 14 Python
套娃式文件夹如何通过Python批量处理
Aug 23 Python
python3.9.1环境安装的方法(图文)
Feb 02 Python
Python Flask请求扩展与中间件相关知识总结
Jun 11 Python
Python可视化学习之seaborn调色盘
Feb 24 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
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
2019/08/12 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
Python正则表达式介绍
2012/08/06 Python
python中模块查找的原理与方法详解
2017/08/11 Python
python3爬取各类天气信息
2018/02/24 Python
解决python删除文件的权限错误问题
2018/04/24 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
公积金单位接收函
2014/01/11 职场文书
大三学习计划书范文
2014/05/02 职场文书
群众路线个人整改措施
2014/10/24 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
SQLServer中exists和except用法介绍
2021/12/04 SQL Server