Python Threading模块内存占用过高:如何释放内存?
解决Python定时任务内存泄漏问题
原代码的核心问题
- 拼写错误:
threading.Time应为threading.Timer - 线程堆积:递归调用
bot_task会不断创建新的Timer线程,运行数小时后线程数量会持续累积,每个线程占用的内存无法及时回收,最终导致内存占用飙升 - 逻辑错误:
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
相关产品推荐
相关产品推荐

