Python Selenium 超时异常不释放之前的内存,如何解决内存泄漏?

0 投票
1 回答
1024 浏览
提问于 2025-04-18 12:15

当我的请求触发超时异常时,任务管理器或系统监视器中显示的 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程序,以及它启动的所有子进程。

[编辑] 你也可以使用其他方法来实现这个功能。

撰写回答