在mpi4py中以非阻塞方式接收序列化对象

4 投票
1 回答
3233 浏览
提问于 2025-04-18 15:05

有没有一种不阻塞的方式,可以从另一个进程接收一个被“腌制”的(也就是序列化过的)项目?我用的 Irecv 只适用于 numpy 数组。我想要一个可以处理字典的函数。

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}

撰写回答