Исключение тайм-аута Python Selenium не освобождает предыдущую память, как удалить эту утечку памяти?

#python #selenium #memory-leaks #timeout #phantomjs

#python #selenium #утечки памяти #тайм-аут #phantomjs

Вопрос:

Когда мой запрос вызывает исключение тайм-аута, использование памяти процессом 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:

Я одна из жертв такого поведения. Я не пробовал PhantomJS, я использую Chromedriver.

в последнем блоке исключения, что вы можете сделать, вы можете использовать методы операционной системы для принудительного освобождения ресурсов.

в Windows вы можете сделать это следующим образом.

 os.system("taskkill /im chromedriver.exe /f /t >nul 2>amp;1")
  

Это убивает все экземпляры chromedriver. или заменить chromedriver.exe любыми ресурсами, которые вы хотите.

обычно рекомендуется перехватывать исключение TimeoutException в одном блоке и сохранять в другом блоке except. будьте осторожны при использовании приведенного выше кода, это уничтожит все текущие chromedriver.exe программы, а также все запущенные им подпроцессы.

[редактировать] вы также можете использовать какой-либо другой метод для достижения этой цели