Python多进程通信Queue、Pipe、Value、Array实例
来源:互联网 发布:淘宝彩票走势图 编辑:程序博客网 时间:2024/04/30 19:20
这篇文章主要介绍了Python多进程通信Queue、Pipe、Value、Array实例,queue和pipe用来在进程间传递消息、Value + Array 是python中共享内存映射文件的方法,需要的朋友可以参考下
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 multiprocessingimport timeclass 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) returnclass 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处理完毕。
运行结果:
2)pipe
pipe()返回一对连接对象,代表了pipe的两端。每个对象都有send()和recv()方法。
代码:
from multiprocessing import Process, Pipedef 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, Arraydef f(n, a): n.value = n.value + 1 for i in range(len(a)): a[i] = a[i] * 10if __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]
0 0
- Python多进程通信Queue、Pipe、Value、Array实例
- python类库32[多进程通信Queue+Pipe+Value+Array]
- Python 进程间通信 Queue
- python进程间通信-Queue
- python进程的通信:queue、进程池中的Queue
- Python 进程,管道( multiprocessing.Pipe() ),进程通信(双向通信)
- 进程通信之一 pipe
- 进程间pipe通信
- 进程通信----管道(pipe)
- 进程间通信-Queue(python版)
- python 多进程通信模块实例 代码
- linux进程通信--管道(pipe)(含实例代码)
- 进程通信的实例--管道(pipe)
- Linux进程间通信——pipe应用实例
- 进程通信之pipe通信
- python multiprocessing.Pipe() Queue 示例
- python 多进程实例 进程间的通信
- Python 进程通信,队列(multiprocessing.Queue()),单向通信
- 动态管理片段
- 如何给RadioButton设置图片大小
- 在使用模板类的时候注意事项
- Kendo UI grid API 获取 filter 后的所有数据
- PHP空间出现session无法保存问题解决办法
- Python多进程通信Queue、Pipe、Value、Array实例
- spring的AOP基础、前置通知与后置通知
- C语言简单递归实现字符串逆序输出
- 全国雾霾大数据,哪里才是桃花源?
- ios中如何自定义数字键盘
- 编写宏时需要注意的几点
- 2015年, 常见页面问题及其解决方法--css篇
- 居中相对定位和绝对定位的元素
- iso小练习,获取界面的空间,变量字符串int循环判断,get请求数据