我正在运行一个Django服务,该服务启动了一个chromedriver for selenium并在网站上搜索数据。 Django服务由另一个Java服务通过HTTP调用。
以下是代码:
views.py
get_data(browser)
try:
.
.
.
for i in range(1,6):
try:
.
.
.
return "success data"
except NoSuchElementException:
browser.back()
raise Exception("No results found")
except Exception as e:
print str(e)
raise
scraper.py
public void MyProcess(FileItem file)
{
List<string> lines = file.GetLines(); //some process to get the lines to handle
long cntr = 0; //The counter to track
Parallel.ForEach(lines, crntLine =>
{
Console.Writeline(String.Format("Currently finished {0} out of {1} lines",cntr,lines.Count());
InterLocked.Increment(ref cntr);
//...Code to process crntLine here
});
}
问题是,在java服务完成所有调用并且整个过程完成之后,RAM中孤立的25到50个chrome进程占用超过1 GB。我在这里做错了吗?
答案 0 :(得分:5)
这是一个老问题。虽然很脏,但对我来说有用的是在退出之前加一个睡眠:
time.sleep(5)
browser.quit()
答案 1 :(得分:0)
请在尝试/除外退出和环绕代码前关闭。
try:
browser.quit()
except WebDriverException:
pass
答案 2 :(得分:0)
想要扩展@Serge B给出的答案。
在browser.close()上使用browser.quit()确实更好,因为当第一个窗口关闭所有窗口(以及所有进程)时,最后一个窗口可能只关闭当前窗口。
我仍然认为你不会通过这样做来解决你的问题。
我遇到了同样的问题 - 驱动程序在Java进程运行时没有关闭。我在使用TeamCity运行测试时遇到了它。请尝试在没有您使用的Java服务的情况下运行您的代码,并确保它是问题所在。
如果是问题,那么我建议用Python方法杀死所有进程。这是我使用的解决方案,它对我有用。不幸的是我在那时使用了C#,下一个代码帮助了我https://stackoverflow.com/a/35692319/4019586,但它不是你现在可以使用的。
我不知道如何在Python上做到这一点,但这可能是一个解决方案。 我认为使用Python可以使用https://stackoverflow.com/a/6278951/4019586。
所以积极的一面是你做的都是正确的!)这只是Selenium中的一个错误。