Python并行操作如何将输出收集到单个列表?报错问题问询
问题分析与解决方案
错误原因
AttributeError 与内核无响应
Jupyter Notebook的主模块加载逻辑和普通Python脚本不同,multiprocessing.Pool创建的子进程无法从__main__模块中找到tenfold函数,触发属性找不到的错误。同时你误用了p.map:该方法要求目标函数只能接收单个参数,但tenfold需要两个参数,这种参数不匹配会进一步导致子进程启动失败,最终引发内核挂起无响应。列表输出无法累积
Python多进程之间是内存隔离的,你传递给子进程的out_list是主进程列表的副本,子进程中对output_list的append操作仅会修改副本,不会同步到主进程的原列表,所以即使没有报错,主进程的out_list也不会有任何内容。
可行的实现方式
方法1:子进程返回结果,主进程收集(推荐)
这种方式无需共享内存,直接利用进程池的返回值收集结果,逻辑简单且可靠:
from multiprocessing import Pool import os def tenfold(input_value): output_value = input_value * 10 print(input_value, output_value) return output_value def main(): cores = os.cpu_count() workers = min(30, cores) # 避免创建超过CPU核心数的进程,减少调度开销 print('n cores: ', cores, ', n workers: ', workers) inputs = range(0,5) with Pool(workers) as p: global out_list out_list = p.map(tenfold, inputs) if __name__ == '__main__': out_list = [] main() print(out_list) # 输出: [0, 10, 20, 30, 40]
方法2:使用跨进程共享列表
如果必须在子进程中直接修改共享列表,可以用multiprocessing.Manager创建支持跨进程访问的列表:
from multiprocessing import Pool, Manager import os def tenfold(input_value, output_list): output_value = input_value * 10 print(input_value, output_value) output_list.append(output_value) def main(): cores = os.cpu_count() workers = min(30, cores) print('n cores: ', cores, ', n workers: ', workers) # 创建跨进程共享的列表对象 with Manager() as manager: out_list = manager.list() tups = [(i, out_list) for i in range(0,5)] with Pool(workers) as p: # 用starmap传递多参数元组 p.starmap(tenfold, tups) # 将共享列表转为普通列表 global final_out_list final_out_list = list(out_list) if __name__ == '__main__': final_out_list = [] main() print(final_out_list) # 输出: [0, 10, 20, 30, 40]
注意事项
- 在Jupyter环境中使用多进程,优先选择返回值收集结果的方式,比共享内存更稳定。
- 工作进程数不要超过CPU核心数,否则会增加进程调度开销,反而降低执行效率。
内容的提问来源于stack exchange,提问作者Ninja Chris
相关产品推荐
相关产品推荐

