您的位置:首页 > 编程语言 > Python开发

Python 多进程 进程间通讯

2018-04-09 07:23 579 查看

进程间通信

Process
之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。Python的
multiprocessing
模块包装了底层的机制,提供了
Queue
Pipes
等多种方式来交换数据。

我们以
Queue
为例,在父进程中创建两个子进程,一个往
Queue
里写数据,一个从
Queue
里读数据

在Unix/Linux下,
multiprocessing
模块封装了
fork()
调用,使我们不需要关注
fork()
的细节。由于Windows没有
fork
调用,因此,
multiprocessing
需要“模拟”出
fork
的效果,父进程所有Python对象都必须通过pickle序列化再传到子进程去,所有,如果
multiprocessing
在Windows下调用失败了,要先考虑是不是pickle失败了。

from multiprocessing import Process, Queue
import os, time, random

# 写数据进程执行的代码:
def write(q):
for value in range(10):
print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())

# 读数据进程执行的代码:
def read(q):
while True:
value = q.get(True)
print('Get %s from queue.' % value)

if __name__ == '__main__':
# 父进程创建Queue,并传给各个子进程:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
# 启动子进程pw,写入:
pw.start()
# 启动子进程pr,读取:
pr.start()
# 等待pw结束:
pw.join()
# pr进程里是死循环,无法等待其结束,只能强行终止:
pr.terminate()

结果

Put 0 to queue...
Get 0 from queue.
Put 1 to queue...
Get 1 from queue.
Put 2 to queue...
Get 2 from queue.
Put 3 to queue...
Get 3 from queue.
Put 4 to queue...
Get 4 from queue.
Put 5 to queue...
Get 5 from queue.
Put 6 to queue...
Get 6 from queue.
Put 7 to queue...
Get 7 from queue.
Put 8 to queue...
Get 8 from queue.
Put 9 to queue...
Get 9 from queue.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: