Python Selenium 超时异常不释放之前的内存,如何解决内存泄漏?
当我的请求触发超时异常时,任务管理器或系统监视器中显示的 Python 进程的内存使用量总是会增加。如果我忽略这个异常,我并没有意识到这一点,因为系统会杀掉这个进程。
但是,当我在超时异常后尝试获取一些新的 URL 请求时,我发现内存使用量增加了。如果请求成功,它不会留下任何内存泄漏。那么,当页面成功加载和触发超时异常时,处理方式有什么不同呢?为什么超时异常不会清除之前的内存?有没有办法去除内存泄漏呢?
def run():
try:
driver = webdriver.PhantomJS()
driver.set_page_load_timeout(20)
driver.get(url)
driver.quit()
del driver
run()
except KeyboardInterrupt:
raise
except:
print " ::: TIMEOUT "
driver.quit()
del driver
driver = None
gc.collect()
#here, python process (memory usage) in Task Manager / System Monitor always increase. if I call this function recursively, memory leak always increase when Timeout exception triggered.
====
Python 2.7
Selenium 2.42.1
PhantomJS 1.9.7
1 个回答
0
我也是遇到这个问题的人之一。 我没有尝试过PhantomJS,而是使用Chromedriver。
在最后的异常处理块中,你可以使用操作系统的方法强制释放资源。
在Windows系统中,你可以这样做。
os.system("taskkill /im chromedriver.exe /f /t >nul 2>&1")
这会结束所有的chromedriver实例。你也可以把chromedriver.exe换成你想要释放的其他资源。
一般来说,最佳做法是把TimeOutException放在一个处理块中,其他的异常放在另一个处理块中。 使用上面的代码时要小心,它会结束所有当前运行的chromedriver.exe程序,以及它启动的所有子进程。
[编辑] 你也可以使用其他方法来实现这个功能。