我试图使用多处理在Python 3.7中运行我的代码,但遇到了一个问题。当我尝试运行代码时出现错误:
Can't pickle local object 'mm_prepare_run.<locals>...
我知道这是泡菜的问题,但我没有找到一个正确的答案来解决这个问题。
我的简单代码如下。你能建议我怎样解决这个问题吗?
import multiprocessing
import copy
from pathlib import Path
proc_mrg = multiprocessing.Manager()
num_cpu = 8 # number of CPU
def prepare_run(config):
din['config'] = config
din_temp = copy.deepcopy(din)
dout_list.append(proc_mrg.dict({}))
#process = multiprocessing.Process(target=Run_IDEAS_instance_get_trajectory,args=(din_temp, dout_list[-1]))
process = multiprocessing.Process(target=Run_IDEAS_instance_get_trajectory(din_temp, dout_list[-1]))
proc_list.append(process)
for job in proc_list:
job.start()
创建Process
时,在prepare_run
中,调用Run_IDEAS_instance_get_trajectory
,而不是将其作为引用传递。并且由于该函数不返回结果,所以Process
的target
是None
。
使用这个替代:
process = multiprocessing.Process(
target=Run_IDEAS_instance_get_trajectory,
args=(din_temp, dout_list[-1])
)
Python中的函数是可调用类型的第一类对象。参见";数据模型";Python语言参考中的第章。
编辑:
从你的评论中,我可以看到你正在ms windows上运行这段代码。在此平台上,需要在if __name__ == "__main__"
块内运行流程创建!由于multiprocessing
在该平台上的工作方式,python必须能够导入脚本,而不会产生副作用,例如启动新进程。参见";编程指南";multiprocessing
文档中的部分。