PyCharm中Python多进程:非main代码块重复执行问题求助
解决Python多进程中模块级代码重复执行的问题
这是Windows系统下Python多进程的典型行为——当你用multiprocessing.Pool创建子进程时,默认采用spawn启动方式,每个子进程都会重新导入你的主模块。这就导致所有写在if __name__ == '__main__':之外的模块级代码(比如你示例里的print('het')、odKeyList的定义),会被每个子进程执行一遍,次数正好等于你创建的进程数。
你之前拆分文件没解决问题,是因为如果拆分后的模块里依然有模块级的执行代码,子进程导入该模块时还是会触发这些代码。
解决方案:
把所有不需要子进程执行的代码,全部放到if __name__ == '__main__':代码块内:
- 只在模块级保留子进程需要调用的函数、导入语句这类无副作用的代码;
- 所有初始化逻辑、主进程独有的执行代码、打印输出等,都移到main块里。
修改后的代码示例:
import multiprocessing import time def list_function_multiprocessing(setlist, function): from multiprocessing import Pool num_cores = multiprocessing.cpu_count() pool = Pool(processes=num_cores-4) start = time.time() results_list = pool.starmap(function, setlist) pool.close() pool.join() return results_list, time.time() - start # 仅保留子进程需要调用的函数、必要导入,无其他模块级执行代码 if __name__ == '__main__': # 主进程专属的初始化与执行逻辑 odKeyList = list((tGr, i[0], i[1], 5) for i in scaled_od_dic) res01, res01CTime = list_function_multiprocessing(odKeyList, kth_shortest_path) print(res01CTime) print('het')
这样修改后,子进程导入模块时只会执行模块级的函数定义和导入语句,不会再触发主进程的初始化与打印逻辑,自然就不会重复执行print('het')这类代码,同时多进程功能也能正常运行。
内容的提问来源于stack exchange,提问作者ajeddi1
相关产品推荐
相关产品推荐

