Проблемы с настройкой одновременных вызовов веб-драйверов Selenium на удаленном сервере - PullRequest
1 голос
/ 07 апреля 2020

, когда я запускаю следующий код на моем персональном компьютере, он работает нормально:

from selenium import webdriver
from concurrent.futures import ThreadPoolExecutor

def open_driver(num):
    options = webdriver.firefox.options.Options()
    options.headless = True
    print("Starting")
    with webdriver.Firefox() as driver:
        pass
    print("Ending")
    return num

if __name__ == '__main__':
    with ThreadPoolExecutor(6) as executor:
        results = executor.map(open_driver,list(range(6)))
    print(list(results))

Вывод:

StartingStarting

Starting
Starting
StartingStarting

Ending
Ending
Ending
Ending
Ending
Ending
[0, 1, 2, 3, 4, 5]

Однако, когда я пытаюсь запустить его на удаленном компьютере Сервер DigitalOcean (работает под управлением Ubuntu выпуска 18.04), он выдает следующую ошибку:

Traceback (most recent call last):
  File "multi_drive.py", line 32, in <module>
    print(list(results))
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 586, in result_iterator
    yield fs.pop().result()
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 425, in result
    return self.__get_result()
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/usr/lib/python3.6/concurrent/futures/thread.py", line 56, in run
    result = self.fn(*self.args, **self.kwargs)
  File "multi_drive.py", line 24, in open_driver
    with webdriver.Firefox(options = options, executable_path = '/home/ubuntu/.local/bin/geckodriver') as browser:
  File "/home/ubuntu/testing/venv/lib/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 174, in __init__
    keep_alive=True)
  File "/home/ubuntu/testing/venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/home/ubuntu/testing/venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/ubuntu/testing/venv/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/ubuntu/testing/venv/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: invalid argument: can't kill an exited process

Я понимаю, что эта проблема обычно вызвана несовместимостью между версиями библиотеки, но я не думаю, что это имеет место здесь (Mozilla Firefox 74.0.1, geckodriver 0.26.0, селен 3.141.0). Я могу запускать отдельные экземпляры веб-драйвера в оболочке Python без ошибок, и когда я изменяю переменную threadpool max_workers на:

 with ThreadPoolExecutor(1) as executor:

Программа запускается как задумано (за исключением параллелизма):

Starting
Finally
Starting
Finally
Starting
Finally
Starting
Finally
Starting
Finally
Starting
Finally
[0, 1, 2, 3, 4, 5]

Программа также запускает без ошибки , когда я устанавливаю счетчик пула равным 2, поэтому возможна некоторая степень параллелизма (и max_workers = 6 отлично работает для кода без вызова веб-драйвера).

max_workers = 3 кажется порогом, при котором программа начинает отказывать.

(Не уверен, если уместно, но «cat / proc / sys / kernel / threads-max» здесь выдает 7677)

Это ограничение сервера? (Программное или аппаратное обеспечение?) Как я могу проверить? Иначе что на земле здесь происходит ?? Любая помощь приветствуется. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...