多核心分配运行Python脚本后数据未保存问题求助
问题分析与解决方案
核心问题定位
你的代码存在两个关键问题导致脚本未正常执行、数据未保存:
- CPU亲和性映射逻辑错误:
cpu_affinities字典仅包含1-4的键,但你提交的脚本编号是1-12,直接调用cpu_affinities[script_number]会触发KeyError,导致进程崩溃,脚本根本没执行。 - 子进程亲和性未继承:用
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)
关键修正说明
- 亲和性映射修复:通过区间判断将12个脚本正确映射到4个核心,避免键不存在的错误。
- 子进程执行优化:用
subprocess.run替代os.system,可捕获脚本执行的错误信息,且子进程会继承当前进程的CPU亲和性设置。 - 资源管理优化:使用
with语句管理进程池,自动完成关闭、等待等操作,代码更简洁安全。 - 输出文件规范:确保每个脚本写入独立的文件,避免多进程同时写入同一文件导致的内容混乱或丢失。
内容的提问来源于stack exchange,提问作者KeplerNick123
相关产品推荐
相关产品推荐

