13-Pipe管道-进程间通信
Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数
- duplex参数为True(默认值),则管道是双工模式,即conn1和conn2均可收发。
- duplex参数为False,conn1只负责接受消息,conn2只负责发送消息。
send和recv方法分别是发送和接受消息的方法。例如,在双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息。如果没有消息可接收,recv方法会一直阻塞。如果管道已经被关闭,那么recv方法会抛出EOFError。
pipe是半双工的通信机制,如果进程间要使用全双工的通信,可以创建两条管道来达到全双工的效果。另外,pipe匿名管道只能用来在拥有同一个父进程的进程间通信。
单工模式¶
"单工模式"
import multiprocessing
import time
def process_receiver(pipe):
while True:
data = pipe.recv()
print("pipe -> recv: \33[42;1m 接收 \033[0m", data)
def process_sender(pipe):
for i in range(100):
print("send -> pipe: \33[41;1m 发送 \033[0m",i)
pipe.send(i)
time.sleep(1)
if __name__ == '__main__':
# duplex双工模式(双工模式, 单工模式),默认为True 双工
pipe = multiprocessing.Pipe(duplex=False)
p_sender = multiprocessing.Process(target=process_sender, args=(pipe[1],))
p_receiver = multiprocessing.Process(target=process_receiver, args=(pipe[0],))
p_sender.start()
p_receiver.start()
双工模式¶
"""
双工
"""
import multiprocessing
import time
def process_receiver(pipe):
while True:
data = pipe.recv()
print("pipe -> recv: \33[42;1m 接收 \033[0m", data)
pipe.send("报告:{}".format(data))
def process_sender(pipe):
for i in range(100):
print("send -> pipe: \33[41;1m 发送 \033[0m",i)
pipe.send(i)
resp = pipe.recv()
print("收到回复-> {}".format(resp))
time.sleep(1)
if __name__ == '__main__':
# duplex双工模式,默认为True
pipe = multiprocessing.Pipe(duplex=True)
p_receiver = multiprocessing.Process(target=process_receiver, args=(pipe[0],))
p_sender = multiprocessing.Process(target=process_sender, args=(pipe[1],))
p_receiver.start()
p_sender.start()