mpi4py - 分散和收集循环的死锁

时间:2021-06-02 21:52:06

标签: python mpi mpi4py

嗨,我正在使用 mpi4py 来玩 MPI。 我的用例是我有一个 Python Queue 对象,它保存要处理的任务,如下所示:

from queue import Queue
my_queue = Queue()
my_queue.put({'task': [1, 2, 3]})
# while True:
if comm.rank == 0:
  task = my_queue.get()
else:
  task = None
work = comm.scatter(task, root=0)
calc = do_calculation(work) # whatever calculation
result = comm.gather(calc, root=0)
if comm.rank == 0:
  print(result)

这工作得很好,如果我继续追加任务(所以一开始我将 2 个任务放入队列并复制上面的代码),它也能正常工作。我现在的目标是让这段代码在无限循环中运行,并且无论何时将某些内容放入队列(即使用单独的线程等)都应该对其进行处理(my_queue.get() 应该是阻塞的,所以这不是问题).

但是当我尝试将这段代码包装在无限循环 while True: 中(请参阅注释)时,程序不会产生任何输出并且只是锁定(看起来像是死锁)。

1 个答案:

答案 0 :(得分:0)

我找到了问题的答案。没有出现僵局。代码完美运行,唯一的问题是标准输出的缓冲区没有被刷新。这导致结果没有打印到控制台,我认为代码产生了死锁。

添加行 sys.stdout.flush() 以手动刷新缓冲区会将结果打印到控制台并解决我的问题。