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

时间:2019-10-23 18:38:20

标签: python python-3.x python-multiprocessing

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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