Python 并行队列系统,是否有一个非阻塞等价物来聚集?mpi4py
我想在参数列表上创建一个循环(比如50)。 循环应该由多个并行处理器(比如4个)共享。 我希望每个处理器从列表中选择下一个参数 并使用此参数调用函数。 功能评估预计将花费不同的时间。 以下是我希望如何安排作业的示意图:Python 并行队列系统,是否有一个非阻塞等价物来聚集?mpi4py,python,python-2.7,loops,mpi,mpi4py,Python,Python 2.7,Loops,Mpi,Mpi4py,我想在参数列表上创建一个循环(比如50)。 循环应该由多个并行处理器(比如4个)共享。 我希望每个处理器从列表中选择下一个参数 并使用此参数调用函数。 功能评估预计将花费不同的时间。 以下是我希望如何安排作业的示意图: pr0 ===job0=== | ========job5======= | pr1 =====job1======= | ==job7== | pr2 ===job2=== | ===job6=== | pr3 =job3= | =========job4========
pr0 ===job0=== | ========job5======= |
pr1 =====job1======= | ==job7== |
pr2 ===job2=== | ===job6=== |
pr3 =job3= | =========job4======== |
我希望每个进程都知道当前正在运行的作业的ID,这样它就可以选择列表中的下一个元素并开始使用它。到目前为止,我尝试使用的是comm.allgather()
:
换句话说,我希望一个进程能够随时从所有其他进程访问计数器
变量。我是否可以在进程启动作业之前进行非阻塞发送,并使其计数器可用于其他进程。也许共享这个变量的内存是另一种方法
有没有一种方法可以实现这一点而不需要专门的进程来进行计数?您是否查看了多处理
模块中的池
类?它可以处理任务的分配(简化您的程序)。[虽然你的问题特别要求不要使用专用流程,但这似乎是在重新发明轮子]@sci prog谢谢!不,我会的,但这是不是意味着离开mpi4py,还是可以合并?看一看
from mpi4py import MPI
from random import random
from time import sleep
##### function that just wastes 0-10sec of our time
def run_test(counter, param ):
time_to_waste = random() * 10
sleep( time_to_waste )
print " run job nr: ", counter, "with parameters: ", param, "in :", time_to_waste, "s"
return
############# MAIN
if __name__ == "__main__":
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
parameters = [random()] * 50
counter = rank
while counter <= 50:
param = parameters[counter]
run_test( counter, param )
print rank, comm.allgather(counter)
counter = max( comm.allgather(counter) ) + size
counter += size
pr0 ===job0=== | ========job4======= |
pr1 =====job1======= | ==job5== |
pr2 ===job2=== | ===job6=== |
pr3 =job3= | =========job7======== |