Python Зависание многопроцессорности + логирования - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь настроить структуру ведения журнала Python для обработки сообщений от нескольких процессов из multiprocessing.Pool. В большинстве случаев сценарий зависает на неопределенное время, хотя наблюдались некоторые другие варианты поведения, такие как выход без печати всех сообщений журнала.

Мой фактический код более сложен, но я сократил его до следующего сценария, который достаточно надежно ломается на компьютерах, на которых я тестировал его. * Ожидаемое поведение - сценарий должен 1000 раз регистрировать «Hello X from MP».

Фактическое поведение - в какой-то момент (варьируется между запусками, иногда не происходит вообще) программа зависает на неопределенное время. Нажатие Ctrl + C вызовет трассировку и некоторые сообщения журнала, затем повторное нажатие Ctrl + C завершит скрипт другой трассировкой.

Пример вывода в случае неудачного запуска (очень недетерминированный c , но в целом выглядит примерно так):

# First several hundred lines of logs removed - as far as I can tell, there's not much of interest missing.

[INFO] 1590652696.6525624 __mp_main__ (72404~SpawnPoolWorker-4): Hello 456 from MP
[INFO] 1590652696.6525996 __mp_main__ (72404~SpawnPoolWorker-4): Hello 457 from MP
[INFO] 1590652696.6526365 __mp_main__ (72404~SpawnPoolWorker-4): Hello 458 from MP
[INFO] 1590652696.6526761 __mp_main__ (72404~SpawnPoolWorker-4): Hello 459 from MP
[INFO] 1590652696.6527176 __mp_main__ (72404~SpawnPoolWorker-4): Hello 460 from MP
[INFO] 1590652696.6527598 __mp_main__ (72404~SpawnPoolWorker-4): Hello 461 from MP
^CTraceback (most recent call last):
  File "./test_logging.py", line 62, in <module>
    _globalListener.stop()
  File "/usr/lib/python3.8/logging/handlers.py", line 1508, in stop
    self._thread.join()
  File "/usr/lib/python3.8/threading.py", line 1011, in join
    self._wait_for_tstate_lock()
  File "/usr/lib/python3.8/threading.py", line 1027, in _wait_for_tstate_lock
    elif lock.acquire(block, timeout):
KeyboardInterrupt
[INFO/MainProcess] process shutting down
[DEBUG/MainProcess] running all "atexit" finalizers with priority >= 0
[DEBUG/MainProcess] telling queue thread to quit
[DEBUG/MainProcess] running the remaining "atexit" finalizers
[DEBUG/MainProcess] joining queue thread
^CError in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/usr/lib/python3.8/multiprocessing/util.py", line 300, in _run_finalizers
    finalizer()
  File "/usr/lib/python3.8/multiprocessing/util.py", line 224, in __call__
    res = self._callback(*self._args, **self._kwargs)
  File "/usr/lib/python3.8/multiprocessing/queues.py", line 195, in _finalize_join
    thread.join()
  File "/usr/lib/python3.8/threading.py", line 1011, in join
    self._wait_for_tstate_lock()
  File "/usr/lib/python3.8/threading.py", line 1027, in _wait_for_tstate_lock
    elif lock.acquire(block, timeout):
KeyboardInterrupt

Конфигурация системы: Я воспроизвел это на Python 3.8.3 на Arch Linux (актуально на сегодняшний день) на 3 разных машинах и на Python 3.7.7 на Fedora 30.

Любое понимание проблемы было бы очень признательно - я долго ломал голову над этим.

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