#9 Python进程通信
有时候需求并不是简简单单的产生多个进程即可,而是会对进程提出更高的要求,比如进程1完成进程2才能启动、进程3工作时进程4不可以工作等要求,这就涉及到了进程的通信,尤其体现在进程的同步和互斥,本小节博文将继续深入Python进程,Here we go!
队列
进程之间无法直接通信,必须通过“中间人”传递消息,从而间接的达到通信目的。能作为“中间人”身份的有两种:队列和管道。
队列是一种数据结构,特点是“先进先出(FIFO)”,与栈刚好相反,队列就是一种排队模型,谁先来谁先享受服务。 1
2
3
4
5
6
7
8
9--------------------------------     ______________
--------------------------------    < 卖老婆咯 >
mmmmm     mm   mmmm   mmmm  mmm      --------------
#        m"#  "   "# "   "#   #             \   ^__^
""""mm  #" #    mmm"     m"   #              \  (oo)\_______
     # #mmm#m     "#   m"     #                 (__)\       )\/\
"mmm#"     #  "mmm#" m#mmmm mm#mm                     ||----w |
--------------------------------                      ||     ||
--------------------------------
队列multiprecessing.Queue
注意这里的队列模块是multiprocessing里的Queue,只有这个才能用于进程的通信,自带的系统模块Queue不能实现进程的通信。
multiprocessing.Queue类常用的方法有:
| 方法 | 解释 | 
|---|---|
| put(obj) | 将obj放入队列 | 
| get(obj) | 将obj从队列取出 | 
| empty() | 判断队列是否为空 | 
1  | #!/usr/bin/env python  | 
进程通过Queue通信
1  | #!/usr/bin/env python  | 

管道
管道Pipe是另一种进程通信中介,管道拥有两个口,通常情况下2个进程分别位于管道的两端,管道默认为全双工工作,也就是进程既可以发送数据也可以接受数据。 #### 管道multiprocessing.Pipe multiprocessing.Pipe类常用的方法有:
| 方法 | 解释 | 
|---|---|
| send(obj) | 向管道另一端发送一个obj | 
| recv() | 接受从管道另一端发过来的数据 | 
| close() | 关闭连接 | 
| poll() | 返回连接中是否还有数据可以读取 | 
| send_bytes(buffer) | 发送字节数据 | 
| recv_bytes() | 接受字节数据 | 
| recv_bytes_into(buffer) | 接受字节数据到buffer中 | 
1  | #!/usr/bin/env python  | 
小结
Python进程通信涉及到很多编程思想,利用Queue实现生产者消费者模型,平衡了生产者和消费着的处理能力。