python进程通信:利用Pipe管道进行全双工通信的案例

在网上看到的资料中以单向通信的案例为主,一端作为接收端,一端作为发送端。 为了测试pipe的全双工通信,写了下面的案例。从面的案例可以看到管道的两端都是可读可写的。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import multiprocessing, time
 
def consumer(pipe):
    conn1,conn2 = pipe
    conn2.close()
    while True:                  # 首先做消费者
        try:
            item = conn1.recv()
            if item == None:
                break
            print("cons消费:",item)
        except EOFError:
            break
 
    for item in range(10,20):    # 然后转为生产者
        print('cons生产:',item)
        conn1.send(item)
 
    conn1.close()                # 生产完毕关闭
 
 
 
def producer(pipe):
    conn1,conn2 = pipe
    conn1.close()
    for item in range(10):       # 首先做为生产者
        print('prod生产:',item)
        conn2.send(item)
 
    conn2.send(None)             # 发送一个信号
 
    while True:                  # 变为消费者
        try:
            item = conn2.recv()
            print("prod消费:",item)
        except EOFError:
            break
 
if __name__ == '__main__':
    conn1,conn2 = multiprocessing.Pipe()
 
    cons_p = multiprocessing.Process(target=consumer,args=((conn1,conn2),))
    cons_p.start()
 
    producer((conn1,conn2))
    cons_p.join()