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

Python Threading模块内存占用过高:如何释放内存?

解决Python定时任务内存泄漏问题

原代码的核心问题

  1. 拼写错误:threading.Time应为threading.Timer
  2. 线程堆积:递归调用bot_task会不断创建新的Timer线程,运行数小时后线程数量会持续累积,每个线程占用的内存无法及时回收,最终导致内存占用飙升
  3. 逻辑错误:t.join()会阻塞当前线程,与Timer的异步执行逻辑冲突,进一步加剧线程资源无法释放的问题

修正方案1:单线程循环+sleep(推荐,内存占用稳定)

这种方式避免频繁创建线程,仅用单个线程处理定时任务,内存占用始终保持在较低水平:

import time, os
from datetime import datetime

update_freq_sec = 5
# 适配不同系统的清屏命令,Windows用'cls',Linux/macOS用'clear'
clear = lambda: os.system('cls' if os.name == 'nt' else 'clear')

def bot_task():
    while True:
        print(f'do something example: Last check: {datetime.now().strftime("%d/%m/%Y %H:%M:%S")}')
        clear()
        time.sleep(update_freq_sec)

if __name__ == '__main__':
    bot_task()

修正方案2:正确使用Timer(避免递归堆积)

如果必须使用Timer组件,需调整逻辑,确保任务完成后再创建下一个Timer,避免线程堆积:

import threading, os
from datetime import datetime

update_freq_sec = 5
clear = lambda: os.system('cls' if os.name == 'nt' else 'clear')

def bot_task():
    print(f'do something example: Last check: {datetime.now().strftime("%d/%m/%Y %H:%M:%S")}')
    clear()
    # 任务执行完成后,再创建下一个定时任务
    threading.Timer(update_freq_sec, bot_task).start()

if __name__ == '__main__':
    # 启动第一个定时任务
    threading.Timer(update_freq_sec, bot_task).start()
    # 保持主线程存活,避免程序退出
    threading.Event().wait()

额外内存优化建议

  • 避免在定时任务循环中重复创建大对象,尽量复用变量
  • 如果任务中涉及占用内存较大的对象,执行完成后可通过del large_obj手动解除引用,帮助垃圾回收器更快回收资源
  • 若存在循环引用导致的内存泄漏,可手动触发垃圾回收:import gc; gc.collect()(仅在确认有必要时使用)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:30:22