1- python中的multiprocessing模块支持两种方式在进程间通信,都是基于消息传递机制。之前我们介绍过,消息传递机制缺乏同步机制,在交换的进程中不可复制数据 。
1+ python中的multiprocessing模块支持两种方式在进程间通信,都是基于消息传递机制。之前我们介绍过,由于缺乏同步机制因此不得不采取消息传递机制,在进程间传递复制的数据 。
22##使用multiprocessing.Pipe模块
33
44pipe管道在两个端点间搭建一种通信机制,通过在进程间建立通道使得进程间可以相互通信。
@@ -9,35 +9,35 @@ import os, random
99from multiprocessing import Process, Pipe
1010```
1111
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方法如下 :
1414``` python
1515def producer_task (conn ):
1616 value = random.randint(1 , 10 )
1717 conn.send(value)
1818 print (' Value [%d ] send by PID [%d ]' % (value, os.getpid()))
1919 conn.close()
2020```
21- consumer进程将要执行的任务也很简单,它唯一的任务就是接收A进程传递过程的参数 ,接收本进程的PID,最终打印出来。consumer进程的中传入的consumer_task方法如下:
21+ consumer进程将要执行的任务也很简单,它唯一的任务就是接收A进程传递过来的参数 ,接收本进程的PID,最终打印出来。consumer进程的中传入的consumer_task方法如下:
2222``` python
2323def consumer_task (conn )
2424 print (' Value [%d ] received by PID [%d ]' % (conn.recv(), os.getpid()))
2525```
2626
27- 最后一块将介绍如何调用Pipe()方法创建两个连接对象分别用于producer进程和consumer进程,然后通过参数形式各自传递到consumer_task方法和producer_task方法中去 ,主函数具体如下所是:
27+ 最后一块将介绍如何调用Pipe()方法创建两个连接对象分别用于producer进程和consumer进程,然后通过参数形式各自传递到consumer \_ task方法和producer \_ task方法中去 ,主函数具体如下所是:
2828``` 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,))
3333
34- consumer.start()
35- producer.start()
34+ consumer.start()
35+ producer.start()
3636
37- consumer.join()
37+ consumer.join()
3838 producer.join()
3939```
40- 定义好进程之后,我们便可以调用进程对象的start方法开始执行进程,join方法用于分别等待producer进程和consumer进程执行完毕。下面的截图中我们将看到程序的输出:
40+ 定义好进程之后,我们便可以调用进程对象的start方法开始执行进程,join方法用于分别等待producer进程和consumer进程执行完毕。下面的截图中我们将看到程序的输出:
4141
4242##理解multiprocessing.Queue模块
43- 之前小节中我们分析了如何在进程间创建通信通道来传递消息,现在我们将分析如何更有效的传递消息,这里我们使用mutilprocessing模块下的Queue对象。multoprocessing.Queue对象方法和queue.Queue对象方法类似。然后内在实现却不尽相同,比如multiprocess模块使用了内部线程feeder,把缓冲区中的数据传入目标线程相关连接的管道中 。管道和队列机制均使用了消息传递机制,节省了使用同步机制带来的开销。
43+ 之前小节中我们分析了如何在进程间创建通信通道来传递消息,现在我们将分析如何更有效的传递消息,这里我们使用mutilprocessing模块下的Queue对象。multoprocessing.Queue对象方法和queue.Queue对象方法类似。然后内在实现却不尽相同,比如multiprocess模块使用了内部线程feeder,把缓冲区中的数据传入目标进程相关连接的管道中 。管道和队列机制均使用了消息传递机制,节省了使用同步机制带来的开销。
0 commit comments