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

AWS EC2 Ubuntu实例中Selenium多线程内存占用问题咨询

AWS EC2 Ubuntu上Selenium多线程内存占用问题解答

问题1:未执行driver.close()时的线程与内存占用情况

  • 线程本身:当线程完成任务后,即便没调用driver.close(),Python线程会自动终止,不会持续占用线程资源,但Selenium对应的headless浏览器进程(如Chrome/Chromium实例、chromedriver进程)会留在系统中,持续占用CPU和内存。
  • 关键区别:driver.close()仅关闭当前标签页,不会终止浏览器进程;要彻底释放资源必须调用driver.quit(),它会关闭所有标签页并终止整个浏览器进程及驱动程序。

问题2:线程编号递增是否意味着旧线程持续占用内存

  • 线程编号递增不一定直接说明旧线程存活:
    • 如果你的脚本是每次独立运行(前一次脚本完全退出后再启动),Python的线程ID是单个进程内的局部计数,不会跨进程递增。出现编号从76开始的情况,大概率是你的脚本中线程编号逻辑有全局累加的处理(比如把计数存在文件、数据库等持久化存储中),或者前一次的Python脚本进程未完全退出(后台残留)。
    • 验证方法:运行ps aux | grep python查看是否有残留的脚本进程,运行ps aux | grep chrome查看是否有未关闭的浏览器进程。如果存在残留进程,这些就是内存占用的根源,长期积累会导致RAM耗尽。

内存优化与高效扩展建议

  • 强制资源清理:每个线程的Selenium操作必须放在try/finally块中,确保无论是否报错都执行driver.quit():
    from selenium import webdriver
    
    def thread_task():
        driver = None
        try:
            options = webdriver.ChromeOptions()
            options.add_argument("--headless=new")
            driver = webdriver.Chrome(options=options)
            # 你的业务逻辑代码
        finally:
            if driver:
                driver.quit()
    
  • 控制并发数:根据EC2实例的内存规格调整线程数量,比如t3.large(8G内存)建议并发数不超过30-40,避免内存过载。
  • 监控进程与内存:定期用free -h查看内存使用情况,用ps aux --sort=-%mem | grep chrome排查异常占用的浏览器进程。
  • 脚本退出清理:在脚本主逻辑中添加退出钩子,捕获KeyboardInterrupt或系统终止信号,遍历所有存活的driver实例执行quit操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:52:43