我有一个代码,它在循环中执行许多独立任务,我想将其转换为多处理以加快速度。我已经设法以这种方式加速代码中其他地方的另一个循环任务,这个看起来非常相似。但是,它没有给出以下错误:
File "Z:\Blade Test KTP\BladeTestOptimisationSoftware\python\source\SteadyStateMP.py", line 2196, in <module>
x0,FitnessTracker=GAMainFunc(GAPopulation,GAGeneration,Crossover,Mutation,FitnessScaling,SwapVariables,Bounds,Args+(False,))
File "Z:\Blade Test KTP\BladeTestOptimisationSoftware\python\source\SteadyStateMP.py", line 1480, in GAMainFunc
result = pool.map(func,PopulationList)
File "C:\Python27\lib\multiprocessing\pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "C:\Python27\lib\multiprocessing\pool.py", line 558, in get
raise self._value
NameError: global name 'NodesList' is not defined
不幸的是,一个可运行的例子是不可行的,因为代码量,输入文件的大小以及我将其置于公共领域时遇到麻烦的事实......我没有管理要么在较小的范围内复制问题(如上所述,我在其他地方成功实现了多处理,并且我使代码非常相似)。我的代码结构如下所示:
from functools import partial
import multiprocessing as mp
def OptimFunc(x0,SectionProps,SectionToAnalyse,Nodes,ElNormTarget,OptimInput,
K,Kl,M,Rlb,Damping,Cdb,TestType,TestStandPitch,BladePitch,gravity,FullReturn):
#Do some stuff and return a scalar value. NodesList can be printed
def SwapVariables(Consts,string):
x0=StringToArray(string)
return OptimFunc(x0,*Consts[0])
PopulationList=[list,containing,different,trial,solutions,for,optimisation,function]
Consts=(SectionProps,SectionToAnalyse,Nodes,ElNormTarget,OptimInput,
K,Kl,M,Rlb,Damping,Cdb,TestType,TestStandPitch,BladePitch,gravity)
func=partial(SwapVariables,[Consts])
NoCPUs=mp.cpu_count()
pool=mp.Pool(processes=NoCPUs)
result = pool.map(func,PopulationList)
Error=np.array(result)
pool.close()
这种非并行实现工作正常(字面意思是用itertools.map()或循环替换pool.map())。这和我的成功实现之间的唯一区别是NodesList是一个numpy数组,所以我尝试将数组放在一个字典和一个列表中(这是我成功的并行循环中使用的函数所使用的变量类型)具有相同的错误。我避免像瘟疫这样的全局变量,所以我被侮辱python会建议我使用它们!最奇怪的部分是我可以在愤怒中使用之前在OptimFunc中打印NodesList。对此的任何帮助将不胜感激!