进程间通信(管道)
【一】管道介绍
- 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
'''

浙公网安备 33010602011771号