Python 如何使用MPI验证是否有传入消息发送到我的节点?

Python 如何使用MPI验证是否有传入消息发送到我的节点?,python,mpi,Python,Mpi,我正在做一个使用Python和MPI的项目。在继续执行其他任务之前,项目的每个节点都需要知道是否有任何传入消息 我在一个多节点执行某些操作的系统上工作。一些节点可能需要其他节点的输出,因此需要知道该输出是否可用 为了说明的目的,让我们考虑两个节点A和B。A需要B的输出来执行它的任务,但是如果输出不可用,则需要做一些其他任务,然后验证B是否已经在一个循环中再次发送它的输出。我想做的是验证A中B输出的可用性 我做了一些研究,发现了一个叫做probe的方法,但我不明白,也没有找到一个有用的文档,说明它

我正在做一个使用Python和MPI的项目。在继续执行其他任务之前,项目的每个节点都需要知道是否有任何传入消息

我在一个多节点执行某些操作的系统上工作。一些节点可能需要其他节点的输出,因此需要知道该输出是否可用

为了说明的目的,让我们考虑两个节点A和B。A需要B的输出来执行它的任务,但是如果输出不可用,则需要做一些其他任务,然后验证B是否已经在一个循环中再次发送它的输出。我想做的是验证A中B输出的可用性

我做了一些研究,发现了一个叫做probe的方法,但我不明白,也没有找到一个有用的文档,说明它的功能和使用方法。所以,我不知道这是否解决了我的问题

我想要的想法非常简单:当我使用mpi4py的recv方法时,我只需要检查是否有数据要接收。如果有什么事情,代码会执行一些任务,如果没有,代码会执行一些其他任务。

详细阐述Gilles Gouailladet的评论

如果您知道最终会收到一条消息,但希望在准备和发送消息时能够运行一些计算,那么您希望使用非阻塞接收,而不是探测

基本上使用MPI_Irecv尽快设置接收请求。如果您想知道消息是否已准备就绪,请使用MPI_测试检查请求

这比使用探测要好得多,因为您可以确保接收缓冲区尽早准备好,并且发送方不会被阻止,等待接收方看到有消息并发布接收


对于具体的实现,您必须参考您使用的Python MPI包装器的手册。您还可以在MPI标准本身中找到有用的信息。

为了真正帮助您,我们需要有关应用程序工作方式的更多信息。一般来说,使用irecv而不是probe。谢谢,只是对问题给出了更好的解释。如果您知道可能到达的消息的大小,那么MPI_irecv和MPI_测试是合适的。否则,MPI_Iprobe就是您所需要的。MPI是一个定义良好的标准,所有子例程都有完整的说明和文档。感谢您的回复。这对我真的很有帮助。我正在尝试使用MPI_测试,但它并没有像我预期的那样工作。在文档中,它说如果请求完成,它将返回True,但是当它返回True并且我尝试使用tp-use-MPI_-Wait获取发送的消息时,它会阻止我的程序。我用错了吗?对返回flag=true的MPI_测试的调用完成了请求-您不需要也不应该再调用MPI_来等待该请求。您从提供给MPI_Irecv的缓冲区中获取实际消息。您的python包装器的具体处理与我的不同。谢谢。MPI本身有很多关于C/C++的文档,但对于Python却没有:/我正在检查bitbucket存储库,以验证如何在irecv中使用缓冲区。它说有一个名为buf的可选参数,我可以在其中放置缓冲区。我使用一个对象作为缓冲区,它总是给我错误类型错误:应该是一个可写的缓冲区对象。嗯,我认为这是另一个问题,对于另一个线程,对吗?发布一个我刚刚回答的新问题是正确的。特别是我的答案一般是针对MPI的,因为我不知道您使用的是哪种python绑定。我的回答可能有点误导您,因为mpi4py的高级接口工作方式有点不同。我不得不承认,mpi4py文档非常缺乏。。。