【发布时间】:2021-08-21 01:51:33
【问题描述】:
您好,我正在使用 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: (见注释)中时,程序不会产生任何输出并且只是锁定(似乎是死锁)。
【问题讨论】:
-
如果
comm.rank为零,则循环不暂停。在这种情况下,您预计会发生什么? -
是的,我希望它永远循环,因为
queue.get()无论如何都会阻塞(所以它一直等到新项目被添加到队列中)。 -
“似乎是一个僵局” - 对确认很有帮助。也许您可以将调试器附加到其中两个进程并收集回溯?