我正在将Matlab脚本转换(转换为Python 3),该脚本运行并行循环以在AWS Worker上执行已编译的程序。为了将数据传递到程序,循环必须写入文本文件。我使用joblib Parallel方法成功地在本地计算机的内核上进行了此工作,但是除非我仅使用循环的一次迭代(即一个内核),否则返回的答案是错误的。在Matlab中,我正在将多个数据文件的副本(包括文本输入一个)分发给并行池中的每个工作程序,以使它们之间没有冲突。我怀疑是因为我没有在Python中显式地执行相同的操作,所以每个工作人员都在写入相同的文件。我一直无法发现的是,是否应该让joblib自动复制循环中使用的所有数据,还是我是否需要采用诸如multiprocessing.pool之类的单独方法来完成这项工作。这是到目前为止我对本地池拥有的概述:-
import subprocess as sp
from joblib import Parallel,delayed
ntest=4
tout=500
def test_loop(n):
rc=-1
#open the external parameter
fileID=open('file.txt','w') #data input text file
#.....data written to file depending on the value of n
fileID.close() #close external parameter file
try: #try running test
rc=sp.call('test.run',timeout=tout,stdout=sp.DEVNULL,\
stderr=sp.DEVNULL,shell=True)
ans= #.....result read from test output file
except: #if test fails to execute
ans=deferr #use failure default
if (ans<=0) or (ans>deferr) or (rc!=0):
ans=deferr #catch other types of failure
return ans
errs=Parallel(n_jobs=ntest)(delayed(test_loop)(i) for i in range(0,ntest))
更新(1/16/2019):我检查了将文件名作为参数传递给test_loop的想法,但结果是相同的。
接下来,我从joblib.Parallel切换到multiprocessing.Pool.map:-
if __name__=='__main__':
p=multiprocessing.Pool(processes=4)
errs=p.map(test_loop, range(0,ntest))
p.close()
p.join()
同样,即使这肯定是多进程的,它也默认使用共享内存,并且多个进程写入一个文件的冲突使情况变得混乱。
然后,我读到在需要分布式数据的情况下,建议将mpi4py用于I / O,因此我用MPI等效项替换了文件的打开和写入操作(每次写入都使用类似缓冲区的对象作为字符串):->
import mpi4py.MPI as MPI
comm=MPI.COMM_WORLD
amode=MPI.MODE_RDWR|MPI.MODE_CREATE
def test_loop(n):
rc=-1
#create the external parameter
fileID=MPI.File.Open(comm,'file.txt',amode) #data input text file
fileID.Write(bytes('string varying with n','utf-8'))
fileID.Close() #close external parameter file
仍然没有运气!我显然在这里缺少明显的东西。推荐使用Python作为并行应用程序的理想选择,并且使用每个工作人员本地的独立数据运行许多作业似乎是一个基本应用程序,但是实际上在Web上没有关于如何实现此目的的讨论或示例。在浪费更多时间探索盲区之前,我需要帮助。