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
相关产品推荐
相关产品推荐

