MPI4py中接收一个序列化对象的非阻塞方式

4

有没有一种非阻塞的方法,可以从另一个进程接收一个pickle对象?Irecv只适用于numpy数组。我想要一个能够处理字典的函数。


可能是python MPI sendrecv() to pass a python object的重复问题。 - Wesley Bland
1个回答

7

根据教程,看起来irecv()并未真正实现,因此您需要采用另一种方法:而不是发布接收并使用Test或Wait等待请求准备就绪,您可以使用Probe测试是否有消息等待接收,并在有时使用(阻塞)接收获取它:

#!/usr/bin/env python
from mpi4py import MPI
import time

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank == 0:
   data = {'a': 7, 'b': 3.14}
   time.sleep(3)
   comm.send(data, dest=1, tag=11)
elif rank == 1:
   while not comm.Iprobe(source=0, tag=11):
        print 'rank 1 Doing some work...'
        time.sleep(1)
   rdata = comm.recv(source=0, tag=11)
   print 'rank 1: got ', rdata

运行会得到以下结果:

$ mpirun -np 2 ./foo.py 
rank 1 Doing some work...
rank 1 Doing some work...
rank 1 Doing some work...
rank 1 Doing some work...
rank 1: got  {'a': 7, 'b': 3.1400000000000001}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接