【问题标题】:mpi4py - deadlock with scatter & gather loopmpi4py - 分散和聚集循环的死锁
【发布时间】: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() 无论如何都会阻塞(所以它一直等到新项目被添加到队列中)。
  • “似乎是一个僵局” - 对确认很有帮助。也许您可以将调试器附加到其中两个进程并收集回溯?

标签: python mpi mpi4py


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多