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

如何自动重启Python程序以解决长期运行中的内存泄漏问题?

绝对可行!对于你这种需要长期运行但存在轻微内存泄漏的场景,自动重启确实是个高效的临时解决方案——毕竟手动排查内存泄漏有时候太耗时,尤其是数学研究类程序可能涉及复杂的计算库或数据结构。下面给你几种适配20核环境的实现思路,你可以根据自己的偏好选择:

方法1:Python守护脚本监控重启

写一个独立的主守护脚本,负责启动你的研究程序,同时实时监控内存占用,达到阈值就自动重启。这种方式逻辑直观,方便调整监控参数。

示例代码如下:

import os
import psutil
import time
from subprocess import Popen

# 可配置参数
MAX_MEMORY_GB = 12  # 根据服务器总内存和20核负载调整阈值
RESEARCH_SCRIPT = "your_math_research.py"  # 你的研究程序文件名
WAIT_INTERVAL = 60  # 每60秒检查一次内存
RUN_ARGS = ["--cores", "20"]  # 给研究程序传递的参数

def monitor_and_restart():
    while True:
        # 启动研究进程
        proc = Popen(["python", RESEARCH_SCRIPT] + RUN_ARGS)
        print(f"✅ 启动研究进程,PID: {proc.pid}")
        
        while proc.poll() is None:  # 进程未退出时持续监控
            time.sleep(WAIT_INTERVAL)
            try:
                process = psutil.Process(proc.pid)
                mem_usage = process.memory_info().rss / (1024 ** 3)  # 转换为GB
                print(f"📊 当前内存占用: {mem_usage:.2f} GB")
                
                if mem_usage >= MAX_MEMORY_GB:
                    print(f"⚠️ 内存超出阈值({MAX_MEMORY_GB} GB),正在重启...")
                    proc.kill()
                    break
            except psutil.NoSuchProcess:
                print("❌ 进程意外退出,立即重启")
                break

if __name__ == "__main__":
    monitor_and_restart()

使用说明:

  • 先安装依赖库:pip install psutil
  • 你可以根据服务器实际内存情况,灵活调整MAX_MEMORY_GB的值
  • 如果研究程序需要更多启动参数,直接在RUN_ARGS列表里添加即可
方法2:Linux系统级工具(更稳定)

如果你的服务器是Linux环境,用supervisord或systemd实现自动重启会更可靠,甚至系统重启后也能自动恢复运行。

用supervisord的配置示例:

  1. 安装supervisord:sudo apt install supervisor(Debian/Ubuntu)或pip install supervisor
  2. 在/etc/supervisor/conf.d/目录下创建配置文件math_research.conf:
[program:math_research]
command=python /绝对路径/your_math_research.py --cores 20
directory=/你的程序所在目录
user=你的用户名
autostart=true
autorestart=true  # 进程退出就自动重启
startretries=3    # 失败3次后停止尝试
stdout_logfile=/var/log/math_research.log  # 标准输出日志
stderr_logfile=/var/log/math_research.err.log  # 错误日志
  1. 重启supervisord服务生效:sudo systemctl restart supervisor

这种方式的优势:

  • 无需自己写监控逻辑,工具原生支持进程守护
  • 日志文件可以帮你快速定位程序退出或异常的原因
  • 支持自定义重启策略,避免无限循环重启
方法3:程序内部定时退出+外部循环启动

如果不想额外写守护脚本,可以在研究程序内部添加定时退出逻辑,再配合一个简单的shell脚本循环启动。

比如在你的研究程序中加入:

import time
import sys

# 设置单次运行时长(比如12小时)
MAX_RUN_HOURS = 12
start_time = time.time()

while time.time() - start_time < MAX_RUN_HOURS * 3600:
    # 你的核心研究逻辑,比如处理一批计算任务
    process_calculation_batch()

# 运行时长达标,主动退出
print("⏰ 单次运行时长已满,准备重启...")
sys.exit(0)

然后写一个shell脚本run_loop.sh:

#!/bin/bash
while true; do
    python your_math_research.py --cores 20
    echo "程序已退出,10秒后重启..."
    sleep 10
done

给脚本加执行权限:chmod +x run_loop.sh,直接运行即可:./run_loop.sh

关键注意事项
  • 数据持久化:一定要在程序退出前(或定期)保存中间计算结果到磁盘/数据库,避免重启丢失进度。可以通过捕获SIGTERM信号,在进程被终止前执行保存逻辑。
  • 资源清理:如果程序占用了文件句柄、网络连接等资源,退出前要显式关闭,避免系统资源耗尽。
  • 日志监控:无论用哪种方式,都要开启日志记录,方便后续排查内存泄漏的根源(比如哪部分计算导致内存增长)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:39:27