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

多核心分配运行Python脚本后数据未保存问题求助

问题分析与解决方案

核心问题定位

你的代码存在两个关键问题导致脚本未正常执行、数据未保存:

  1. CPU亲和性映射逻辑错误:cpu_affinities字典仅包含1-4的键,但你提交的脚本编号是1-12,直接调用cpu_affinities[script_number]会触发KeyError,导致进程崩溃,脚本根本没执行。
  2. 子进程亲和性未继承:用os.system启动的新Python进程不会继承当前run_script进程的CPU亲和性设置,且无法捕获脚本执行的错误信息,排查难度大。

此外,单个脚本的fibonacci函数在n=0/1时存在逻辑瑕疵(会返回不符合预期的序列),但这不是数据未保存的直接原因。

修正后的主进程代码

import multiprocessing
import os
import subprocess

def run_script(script_number):
    # 根据脚本编号区间映射到对应核心(逻辑核心编号从0开始)
    if 1 <= script_number <= 3:
        target_core = [0]
    elif 4 <= script_number <= 6:
        target_core = [1]
    elif 7 <= script_number <= 9:
        target_core = [2]
    elif 10 <= script_number <= 12:
        target_core = [3]
    else:
        raise ValueError(f"无效的脚本编号:{script_number}")
    
    # 设置当前进程的CPU亲和性
    os.sched_setaffinity(0, target_core)
    
    # 执行目标脚本,捕获输出与错误信息
    script_path = f"script_{script_number}.py"
    try:
        exec_result = subprocess.run(
            ["python", script_path],
            check=True,
            capture_output=True,
            text=True
        )
        print(f"脚本{script_number}执行完成:{exec_result.stdout.strip()}")
    except subprocess.CalledProcessError as e:
        print(f"脚本{script_number}执行失败:{e.stderr.strip()}")

if __name__ == '__main__':
    # 用上下文管理器管理进程池,自动处理资源释放
    with multiprocessing.Pool(processes=4) as pool:
        pool.map(run_script, range(1, 13))

单个脚本的优化建议

确保每个脚本(如script_1.py、script_2.py...)的输出文件名与自身编号对应,同时修正斐波那契函数的边界逻辑:

import numpy as np

def fibonacci(n):
    if n == 0:
        return []
    elif n == 1:
        return [0]
    sequence = [0, 1]
    while len(sequence) < n:  
        next_num = sequence[-1] + sequence[-2]  
        sequence.append(next_num)  
    return sequence

n = 3
for i in range(n): 
    result = fibonacci(i)
    print(result)
    
    # 文件名与脚本编号对应,避免多进程写入冲突
    with open(f"{script_number}.txt", 'a') as f:
        f.write('\n') 
        f.write(str(result))
    print(result)

关键修正说明

  1. 亲和性映射修复:通过区间判断将12个脚本正确映射到4个核心,避免键不存在的错误。
  2. 子进程执行优化:用subprocess.run替代os.system,可捕获脚本执行的错误信息,且子进程会继承当前进程的CPU亲和性设置。
  3. 资源管理优化:使用with语句管理进程池,自动完成关闭、等待等操作,代码更简洁安全。
  4. 输出文件规范:确保每个脚本写入独立的文件,避免多进程同时写入同一文件导致的内容混乱或丢失。

内容的提问来源于stack exchange,提问作者KeplerNick123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:17:48