进程间通信(管道)

【一】管道介绍

  • multiprocessing模块支持两种形式除了队列还有管道

【1】创建管道的类

# 在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象
# 必须在产生Process对象之前产生管道
from multiprocessing import Pipe

queue = queue.Queue(maxsize)
# maxsize是队列中允许最大项数,省略则无大小限制

【2】方法介绍

  • conn1.recv()

    • 接收conn2.send(obj)发送的对象。
    • 如果没有消息可接收,recv方法会一直阻塞。
    • 如果连接的另外一端已经关闭,那么recv方法会抛出EOFError。
  • conn1.send(obj)

    • 通过连接发送对象。obj是与序列化兼容的任意对象
  • conn1.close():关闭连接

【二】代码实现

from multiprocessing import Pipe, Process


def producer(pipe_conn, name):
    # 【1】获取到两个管道对象 左侧管道对象 右侧管道对象
    left_conn, right_conn = pipe_conn
    # 【2】放数据
    # 先关闭右侧管道
    right_conn.close()
    # 再通过左侧管道传数据
    for i in range(1,4):
        data = f'producer {name} 生产了 {i}'
        print(data)
        left_conn.send(data)
    # 传递完所有数据之后一定不要忘了将打开的管道关闭
    left_conn.close()


def customer(pipe_conn, name):
    # 【1】获取到两个管道对象 左侧管道对象 右侧管道对象
    left_conn, right_conn = pipe_conn
    # 【2】取数据
    # 关闭左管道
    left_conn.close()
    # 通过右管道取数据
    while True:
        data = right_conn.recv()
        print(f'customer {name} 消费了 {data}')
        if not data:
            break
    right_conn.close()


def main():
    # 【一】创建管道对象
    pipe = Pipe()
    # 【二】创建消费者对象和生产者对象
    producer_one = Process(
        target=producer,
        args=(pipe, 'prod_one')
    )
    producer_one.start()
    # 【三】创建消费者
    customer_one = Process(
        target=customer,
        args=(pipe, 'customer_one')
    )
    customer_one.daemon = True
    customer_one.start()
    producer_one.join()


# 管道需要创建一个管道对象
# 管道对象里面有左右两个管道对象
# 传数据的时候要关闭一侧,从另一侧传数据进去
# 取数据的时候也要关闭一侧,从另一端取数据
if __name__ == '__main__':
    main()

'''
producer prod_one 生产了 1
producer prod_one 生产了 2
producer prod_one 生产了 3
'''
posted @ 2024-05-28 16:53  Ligo6  阅读(51)  评论(0)    收藏  举报