我正在使用 pyfmi 与 EnergyPlus 进行模拟。我认识到初始化各个 EnergyPlus 模型需要相当长的时间。因此,我希望找到一种方法来并行初始化模型。我尝试了python库多处理但没有成功。如果重要的话,我在 Ubuntu 16.10 上并使用 Python 3.6。这是我想要串行完成的工作:
fmus = {}
for id in id_list:
chdir(fmu_path+str(id))
fmus[id] = load_fmu('f_' + str(id)+'.fmu',fmu_path+str(id))
fmus[id].initialize(start_time,final_time)
结果是一个以 ids 为键、模型为值的字典:{id1:FMUModelCS1,id2:FMUModelCS1}
目的是稍后通过它们的键调用模型并进行模拟。
这是我对多处理的尝试:
def ep_intialization(id,start_time,final_time):
chdir(fmu_path+str(id))
model = load_fmu('f_' + str(id)+'.fmu',fmu_path+str(id))
model.initialize(start_time,final_time)
return {id:model}
data = ((id,start_time,final_time) for id in id_list)
if __name__ == '__main__':
pool = Pool(processes=cpus)
pool.starmap(ep_intialization, data)
pool.close()
pool.join()
我可以在我的系统监视器中看到模型的进程,但是由于模型不可选择,因此脚本会引发错误:
MaybeEncodingError: Error sending result: '[{id2: <pyfmi.fmi.FMUModelCS1 object at 0x561eaf851188>}]'. Reason: 'TypeError('self._fmu,self.callBackFunctions,self.callbacks,self.context,self.variable_list cannot be converted to a Python object for pickling',)'
但我无法想象没有办法并行初始化模型。也欢迎使用除线程/多处理之外的其他框架/库。
我看到了这个答案,但似乎它侧重于初始化后的模拟。