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 16 Python
pygame实现弹力球及其变速效果
Jul 03 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
将Dataframe数据转化为ndarry数据的方法
Jun 28 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
django项目搭建与Session使用详解
Oct 10 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
python获取引用对象的个数方式
Dec 20 Python
python使用协程实现并发操作的方法详解
Dec 27 Python
python调用私有属性的方法总结
Jul 24 Python
python 利用opencv实现图像网络传输
Nov 12 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 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
PHP中is_dir()函数使用指南
2015/05/08 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
js实现蒙版效果
2020/01/11 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
讲解Python中的标识运算符
2015/05/14 Python
Python3写入文件常用方法实例分析
2015/05/22 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
python实现接口并发测试脚本
2019/06/25 Python
python+logging+yaml实现日志分割
2019/07/22 Python
Python对列表的操作知识点详解
2019/08/20 Python
python中pow函数用法及功能说明
2020/12/04 Python
几个SQL的面试题
2014/03/08 面试题
竞选班长自荐书范文
2014/03/09 职场文书
小学网上祭英烈活动总结
2014/07/05 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
Golang二维数组的使用方式
2021/05/28 Golang
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL