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 相关文章推荐
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
Python高斯消除矩阵
Jan 02 Python
对python3中, print横向输出的方法详解
Jan 28 Python
python中的单引号双引号区别知识点总结
Jun 23 Python
用python3 返回鼠标位置的实现方法(带界面)
Jul 05 Python
Python range、enumerate和zip函数用法详解
Sep 11 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
Jul 30 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 Python
python 实现的IP 存活扫描脚本
Dec 10 Python
python批量提取图片信息并保存的实现
Feb 05 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
php函数的常用方法及注意之处小结
2011/07/10 PHP
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
JS 判断代码全收集
2009/04/28 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
[49:07]VGJ.T vs Optic Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
python web框架学习笔记
2016/05/03 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
django文档学习之applications使用详解
2018/01/29 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
python匿名函数的使用方法解析
2019/10/10 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
老师的检讨书
2014/02/23 职场文书
项目工作说明书
2014/07/29 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
质量保证书格式模板
2015/02/27 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
Nginx快速入门教程
2021/03/31 Servers
MySQL系列之十一 日志记录
2021/07/02 MySQL
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers