#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实现生产者消费者模型,平衡了生产者和消费着的处理能力。