1
- python中的multiprocessing模块支持两种方式在进程间通信,都是基于消息传递机制。之前我们介绍过,消息传递机制缺乏同步机制,在交换的进程中不可复制数据 。
1
+ python中的multiprocessing模块支持两种方式在进程间通信,都是基于消息传递机制。之前我们介绍过,由于缺乏同步机制因此不得不采取消息传递机制,在进程间传递复制的数据 。
2
2
##使用multiprocessing.Pipe模块
3
3
4
4
pipe管道在两个端点间搭建一种通信机制,通过在进程间建立通道使得进程间可以相互通信。
@@ -9,35 +9,35 @@ import os, random
9
9
from multiprocessing import Process, Pipe
10
10
```
11
11
12
- 通过os模块的os.getpid()方法使得我们获得进程的PID。os.getpid()将以一种透明的方式返回程序的PID,在我们的程序中,它分别返回producer_task进程和consumer_task进程的PID 。
13
- 下面我们将定义producer_task方法 ,该方法返回1到10之间的一个随机数。producer_task方法的关键是调用conn .send方法,conn以参数的形式在主函数中传入producer_task方法。producer_task方法如下 :
12
+ 通过os模块的os.getpid()方法使得我们获得进程的PID。os.getpid()将以一种透明的方式返回程序的PID,在我们的程序中,它分别返回producer \_ task进程和consumer \_ task进程的PID 。
13
+ 下面我们将定义producer \_ task方法 ,该方法返回1到10之间的一个随机数。producer \_ task方法的关键是调用conn .send方法,conn以参数的形式在主函数中被传給producer \_ task方法。producer \_ task方法如下 :
14
14
``` python
15
15
def producer_task (conn ):
16
16
value = random.randint(1 , 10 )
17
17
conn.send(value)
18
18
print (' Value [%d ] send by PID [%d ]' % (value, os.getpid()))
19
19
conn.close()
20
20
```
21
- consumer进程将要执行的任务也很简单,它唯一的任务就是接收A进程传递过程的参数 ,接收本进程的PID,最终打印出来。consumer进程的中传入的consumer_task方法如下:
21
+ consumer进程将要执行的任务也很简单,它唯一的任务就是接收A进程传递过来的参数 ,接收本进程的PID,最终打印出来。consumer进程的中传入的consumer_task方法如下:
22
22
``` python
23
23
def consumer_task (conn )
24
24
print (' Value [%d ] received by PID [%d ]' % (conn.recv(), os.getpid()))
25
25
```
26
26
27
- 最后一块将介绍如何调用Pipe()方法创建两个连接对象分别用于producer进程和consumer进程,然后通过参数形式各自传递到consumer_task方法和producer_task方法中去 ,主函数具体如下所是:
27
+ 最后一块将介绍如何调用Pipe()方法创建两个连接对象分别用于producer进程和consumer进程,然后通过参数形式各自传递到consumer \_ task方法和producer \_ task方法中去 ,主函数具体如下所是:
28
28
``` python
29
- if __name__ == ' __main__' :
30
- producer_conn, consumer_conn = Pipe()
31
- consumer = Process(target = consumer_task,args = (consumer_conn,))
32
- producer = Process(target = producer_task,args = (producer_conn,))
29
+ if __name__ == ' __main__' :
30
+ producer_conn, consumer_conn = Pipe()
31
+ consumer = Process(target = consumer_task,args = (consumer_conn,))
32
+ producer = Process(target = producer_task,args = (producer_conn,))
33
33
34
- consumer.start()
35
- producer.start()
34
+ consumer.start()
35
+ producer.start()
36
36
37
- consumer.join()
37
+ consumer.join()
38
38
producer.join()
39
39
```
40
- 定义好进程之后,我们便可以调用进程对象的start方法开始执行进程,join方法用于分别等待producer进程和consumer进程执行完毕。下面的截图中我们将看到程序的输出:
40
+ 定义好进程之后,我们便可以调用进程对象的start方法开始执行进程,join方法用于分别等待producer进程和consumer进程执行完毕。下面的截图中我们将看到程序的输出:
41
41
42
42
##理解multiprocessing.Queue模块
43
- 之前小节中我们分析了如何在进程间创建通信通道来传递消息,现在我们将分析如何更有效的传递消息,这里我们使用mutilprocessing模块下的Queue对象。multoprocessing.Queue对象方法和queue.Queue对象方法类似。然后内在实现却不尽相同,比如multiprocess模块使用了内部线程feeder,把缓冲区中的数据传入目标线程相关连接的管道中 。管道和队列机制均使用了消息传递机制,节省了使用同步机制带来的开销。
43
+ 之前小节中我们分析了如何在进程间创建通信通道来传递消息,现在我们将分析如何更有效的传递消息,这里我们使用mutilprocessing模块下的Queue对象。multoprocessing.Queue对象方法和queue.Queue对象方法类似。然后内在实现却不尽相同,比如multiprocess模块使用了内部线程feeder,把缓冲区中的数据传入目标进程相关连接的管道中 。管道和队列机制均使用了消息传递机制,节省了使用同步机制带来的开销。
0 commit comments