13-Pipe管道-进程间通信

Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数

  1. duplex参数为True(默认值),则管道是双工模式,即conn1和conn2均可收发。
  2. 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()