You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:32:43