原因:应该特别注意管道端点的正确管理问题。
1.如果是生产者或消费者中都没有使用管道的某个端点,就应将它关闭。
2.这也说明了为何在生产者中关闭了管道的输出端,在消费者中关闭管道的输入端。
3.如果忘记执行这些步骤,程序可能在消费者中的recv()操作上挂起。
4.管道是由操作系统进行引用计数的,必须在所有进程中关闭管道后才能生成EOFError异常。
5.因此,在生产者中关闭管道不会有任何效果,除非消费者也关闭了相同的管道端点。
# coding=utf-8
import logging
import multiprocessing
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [*] %(processName)s %(message)s"
)
def consumer (left, right):
left.close() # 因为右管道要发送信息,还要接收信息,这里用不到左管道
logging.info(f'>>> 右管道发送的信息:【你好】')
right.send("【你好】") # 1.给左管道发送信息
while True:
try:
logging.info(f"\t\t右管道接收的信息:{right.recv()}")
except EOFError:
break
def main (ctx):
left, right = ctx.Pipe()
ctx.Process(target=consumer, args=(left, right)).start()
logging.info(f"\t\t左管道接收的信息:{left.recv()}") # 2.接收右管道的信息
right.close() # 左管道要发信息,所以右管道关闭
for i in range(10):
logging.info(f'\t>>> 左管道发送的信息:【{i}个包子】')
left.send(f'【{i}个包子】')
left.close() # 发信息完要关闭,因为后面不在发信息了
if __name__ == '__main__':
# windows 启动方式
multiprocessing.set_start_method('spawn')
# 获取上下文
ctx = multiprocessing.get_context('spawn')
# 检查这是否是冻结的可执行文件中的伪分支进程。
ctx.freeze_support()
main(ctx)
输出:
2019-10-05 18:57:27,765 [*] SpawnProcess-1 >>> 右管道发送的信息:【你好】
2019-10-05 18:57:27,765 [*] MainProcess 左管道接收的信息:【你好】
2019-10-05 18:57:27,766 [*] MainProcess >>> 左管道发送的信息:【0个包子】
2019-10-05 18:57:27,766 [*] MainProcess >>> 左管道发送的信息:【1个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 右管道接收的信息:【0个包子】
2019-10-05 18:57:27,766 [*] MainProcess >>> 左管道发送的信息:【2个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 右管道接收的信息:【1个包子】
2019-10-05 18:57:27,766 [*] MainProcess >>> 左管道发送的信息:【3个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 右管道接收的信息:【2个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 右管道接收的信息:【3个包子】
2019-10-05 18:57:27,766 [*] MainProcess >>> 左管道发送的信息:【4个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 右管道接收的信息:【4个包子】
2019-10-05 18:57:27,766 [*] MainProcess >>> 左管道发送的信息:【5个包子】
2019-10-05 18:57:27,766 [*] SpawnProcess-1 右管道接收的信息:【5个包子】
2019-10-05 18:57:27,766 [*] MainProcess >>> 左管道发送的信息:【6个包子】
2019-10-05 18:57:27,767 [*] SpawnProcess-1 右管道接收的信息:【6个包子】
2019-10-05 18:57:27,767 [*] MainProcess >>> 左管道发送的信息:【7个包子】
2019-10-05 18:57:27,767 [*] SpawnProcess-1 右管道接收的信息:【7个包子】
2019-10-05 18:57:27,767 [*] MainProcess >>> 左管道发送的信息:【8个包子】
2019-10-05 18:57:27,767 [*] SpawnProcess-1 右管道接收的信息:【8个包子】
2019-10-05 18:57:27,767 [*] MainProcess >>> 左管道发送的信息:【9个包子】
2019-10-05 18:57:27,767 [*] SpawnProcess-1 右管道接收的信息:【9个包子】