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

多进程模型评估中终止进程致共享列表为空的问题

问题解决:进程超时终止后保留已完成的模型评估结果

问题根源

你的代码里,子进程会先把所有模型的评估结果存在本地的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:53:06