Python多进程子函数运行遇RuntimeError:启动新进程前引导未完成
Python多进程RuntimeError问题解决指导
你在学习Python多进程编程时,尝试生成数字列表并通过多进程对能被10整除的数字求和,但遇到了RuntimeError,提示在当前进程完成引导阶段前尝试启动新进程。
你的原代码:
import multiprocessing import time def add_multiple_of_10_v0(number): number_list = [] for i in range(1, number): x = i**3 + i**2 + i + 1 number_list.append(x) print(number_list) pool = multiprocessing.Pool(6) result = 0 for value in pool.map(check_multiple_10_v0, number_list): if value > 0: result = result + value else: pass pool.close() pool.join() return result def check_multiple_10_v0(in_number): if in_number % 10 == 0: time.sleep(5) return in_number else: return -1
遇到的错误:
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.This probably means that you are not using fork to start your child processes and you have forgotten to use the proper idiom in the main module: if __name__ == '__main__': freeze_support() ... The "freeze_support()" line can be omitted if the program is not going to be frozen to produce an executable.
错误原因
在Windows等不使用fork机制启动子进程的系统中,Python启动子进程时会重新导入整个主模块。如果没有用if __name__ == '__main__':包裹主执行逻辑,子进程会重复执行创建进程池的代码,导致递归创建进程,触发上述错误。另外,原代码在函数内部创建进程池的写法也容易引发这类问题。
解决方法
- 所有需要启动进程的主执行逻辑,必须放在
if __name__ == '__main__':代码块内,避免子进程重复执行初始化代码 - 拆分函数职责,让生成列表和多进程处理的逻辑更清晰
修改后的完整代码
import multiprocessing import time def generate_number_list(number): # 单独负责生成数字列表 number_list = [] for i in range(1, number): x = i**3 + i**2 + i + 1 number_list.append(x) return number_list def check_multiple_10_v0(in_number): if in_number % 10 == 0: time.sleep(5) return in_number else: return -1 def sum_valid_numbers(number_list): # 多进程求和逻辑 with multiprocessing.Pool(6) as pool: results = pool.map(check_multiple_10_v0, number_list) # 过滤有效结果并求和 return sum(value for value in results if value > 0) if __name__ == '__main__': # 主执行逻辑放在这里 target_number = 100 # 可自行修改这个数值 num_list = generate_number_list(target_number) print(num_list) total = sum_valid_numbers(num_list) print("能被10整除的数字总和:", total)
关键修改点说明
- 使用
if __name__ == '__main__':包裹主程序入口,确保子进程不会重复执行进程池创建逻辑 - 将生成列表、检查数字、求和三个职责拆分为独立函数,代码结构更清晰
- 使用
with语句管理进程池,无需手动调用close()和join(),Python会自动处理资源释放 - 用生成器表达式简化求和逻辑,替代原有的循环累加写法
内容的提问来源于stack exchange,提问作者Prem Ji
相关产品推荐
相关产品推荐

