, когда я запускаю следующий код на моем персональном компьютере, он работает нормально:
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)
Это ограничение сервера? (Программное или аппаратное обеспечение?) Как я могу проверить? Иначе что на земле здесь происходит ?? Любая помощь приветствуется. Спасибо.