如何解决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:
中(请参阅注释)时,程序不会产生任何输出并且只是锁定(看起来像是死锁)。
解决方法
我找到了问题的答案。没有出现僵局。代码完美运行,唯一的问题是标准输出的缓冲区没有被刷新。这导致结果没有打印到控制台,我认为代码产生了死锁。
添加行 sys.stdout.flush()
以手动刷新缓冲区会将结果打印到控制台并解决我的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。