我正在开发一个与一群人密切沟通的计划。我不是特别擅长调试分布式程序,但我强烈怀疑我一次向进程发送了太多消息。我在mpi4py中重新实现了actor模型。每个进程都有一个“邮箱”的作业,当他们完成邮箱后,他们决定进入CHECK_FOR_UPDATES
模式,在那里他们看到是否有任何新邮件可以接收。
我和一群学生一直在研究这个项目的问题。当负载变得太大时,它会开始崩溃,但我们无法弄清楚问题出在哪里,因为我们在调试时非常糟糕。
我问我学校的一些人是否有任何想法,并建议,当我们重新实施演员系统时,我们应该考虑使用Akka。今年一名学生表示可能仍有问题,一名演员可能会被消息淹没并崩溃。 I asked about it here.流模型似乎不是我们想要的(请参阅我的评论以获取更多详细信息),然后我回顾了mpi4py程序,因为我之前没有考虑过这个问题。
在普通的C或Fortran实现中,似乎有一个count
parameter for MPI_Recv
。我注意到comm.recv
没有count
参数,并怀疑当进程进入CHECK_FOR_UPDATES
模式时,它只消耗来自各种来源的大量消息并死掉。 (从技术上讲,我不确定,但我们怀疑可能是这种情况。)有没有办法限制comm.recv
接受的数据量?
(注意:我希望避免使用comm.Recv
变体,因为它会限制用户使用numpy
数组。)
答案 0 :(得分:0)
可以向
recv()
和irecv()
方法传递一个缓冲区对象,该缓冲区对象可以重复用于接收消息以避免内部内存分配。 缓冲区必须足够大才能容纳传输的消息。
强调我的。因此,我必须使用Send
和Recv
。