Windows下Python Multiprocess Pool结果无法直接使用报IndexError怎么解决?
问题根因
你遇到的报错完全是Windows系统下multiprocessing的启动机制和代码结构问题共同导致的:
- Windows系统中Python的
multiprocessing默认使用spawn模式启动子进程,每个子进程启动时会完整重导当前脚本,所有顶层代码都会被自动执行。 - 你没有将全局入口代码
a = my_function_caller()放入if __name__ == '__main__'保护块,导致子进程启动时也会反复执行这段入口逻辑,递归触发子进程创建,这就是报错重复出现的原因。 - 同时你将进程池执行逻辑放在了
my_function内部的if __name__ == '__main__'判断中,子进程执行到这段代码时,__name__的值不等于__main__,results始终是空列表,访问results[0]自然触发索引越界错误。
修复方案
调整代码结构,将入口逻辑放入保护块,同时移除my_function内不必要的__name__判断即可,修改后可直接运行的完整代码如下:
from multiprocessing import Pool import time def my_function_caller(): samples = [] for t in range(2): samples.append(my_function(t)) return samples def my_function(t): results = [] pool = Pool() results = pool.map(task, range(5)) pool.close() pool.join() A = results[0] return A def task(k): time.sleep(1) result = k return result if __name__ == '__main__': a = my_function_caller() # 验证输出,可自行删除 print(a)
优化建议
当前代码在循环中反复创建销毁进程池,会产生不必要的性能开销,建议将进程池提取到外层全局仅创建一次,优化版本如下:
from multiprocessing import Pool import time def my_function_caller(pool): samples = [] for t in range(2): samples.append(my_function(t, pool)) return samples def my_function(t, pool): results = pool.map(task, range(5)) return results[0] def task(k): time.sleep(1) return k if __name__ == '__main__': # 上下文管理器自动处理进程池的关闭和回收 with Pool() as pool: a = my_function_caller(pool) print(a)
内容的提问来源于stack exchange,提问作者Felix P.
相关产品推荐
相关产品推荐

