多处理管道是否填满,如果是,它们在程序中会导致什么行为?

问题描述 投票:0回答:1

我正在研究一个线程化Python程序,并且正在使用管道,但是发现它们在某个点冻结(我认为这是相对少量的数据)。我在下面有一个测试案例。我曾尝试过研究文档,但找不到任何东西。

import multiprocessing
def test():
   out_, in_ = multiprocessing.Pipe()
   for i in range(10**6):
      print(i)
      in_.send(i)

当我运行此代码时,它显示为278,然后停止,这似乎是少量数据。这是由于内存不足或其他原因导致的吗?我可以使用任何变通方法或参数来增加大小吗?

python python-3.x python-multiprocessing
1个回答
0
投票

是的,管道的存储量有限,该数量取决于操作系统。如果某个进程尝试向管道写入数据的速度快于另一个进程从其读取数据的速度,则该管道最终将填满。发生这种情况时,下一次尝试写入的操作将被阻止,直到读者读取足够的空间来为其分配空间。

也可以将管道置于非阻塞模式。在这种情况下,尝试写入完整的管道将返回错误指示,并且写入代码可以决定如何处理它。似乎Python multiprocessing模块没有办法将管道设置为非阻塞。 Python multiprocess non-blocking intercommunication using Pipes表示进行这种处理的方法是使用in_.poll()来判断管道是否可写。

© www.soinside.com 2019 - 2024. All rights reserved.