多进程模型评估中终止进程致共享列表为空的问题
问题解决:进程超时终止后保留已完成的模型评估结果
问题根源
你的代码里,子进程会先把所有模型的评估结果存在本地的inner_results和inner_names列表中,只有等所有模型都跑完,才会一次性把本地列表的内容同步到Manager创建的共享列表里。如果某个模型超时导致进程被终止,循环还没执行到最后的extend语句,共享列表里自然就没有任何已完成的结果。
修复方案
把每一个模型的评估结果实时同步到共享列表,也就是每跑完一个模型,就立刻把结果添加到共享列表里,而不是攒到最后一起同步。
修改后的完整代码
multiprocessing_is_True = True if multiprocessing_is_True: from multiprocessing import Process, Manager from sklearn.model_selection import StratifiedKFold, cross_val_score # 创建共享列表存储结果和模型名称 results = Manager().list() names = Manager().list() def evaluate_models(inner_models, inner_X_train, inner_Y_train, results, names): for name, model in inner_models: kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True) cv_results = cross_val_score(model, inner_X_train, inner_Y_train, cv=kfold, scoring='accuracy') # 每评估完一个模型就实时同步到共享列表 results.append(cv_results) names.append(name) print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std())) # 创建并启动评估进程 evaluation_process = Process(target=evaluate_models, args=(models, X_train, Y_train, results, names)) evaluation_process.start() # 等待进程完成或超时1分钟 timeout = 60 evaluation_process.join(timeout=timeout) # 检查进程是否仍在运行,超时则终止 if evaluation_process.is_alive(): print(f"模型评估超时(超过{timeout}秒),终止当前评估进程。") evaluation_process.terminate() # 转换为普通列表 results = list(results) names = list(names) # 找出准确率最高的模型(增加空列表判断避免报错) if results: max_accuracy_mean = max(result.mean() for result in results) else: max_accuracy_mean = 0.0 # 无结果时的默认值,可按需调整
关键改动说明
- 移除了本地临时列表
inner_results和inner_names,直接在循环内将每个模型的结果实时写入共享列表 - 增加了
if results:的判断逻辑,避免因所有模型都未完成评估(比如第一个模型就超时)导致后续求最大值时抛出空列表异常
内容的提问来源于stack exchange,提问作者My Imperial Lord Daft Vader
相关产品推荐
相关产品推荐

