В модуле multiprocessing
"из коробки" доступна некоторая поддержка логирования/ведения журнала процессов.
Обратите внимание, что модуль logging
не использует разделяемые блокировки процесса, поэтому, в зависимости от типа обработчика, сообщения от разных процессов могут смешиваться.
multiprocessing.get_logger()
:Функция multiprocessing.get_logger()
возвращает регистратор, используемый модулем multiprocessing
. При необходимости будет создан новый.
При первом создании регистратор имеет уровень logging.NOTSET
и не имеет обработчика по умолчанию. Сообщения, отправленные этому регистратору, по умолчанию не передаются корневому регистратору.
Обратите внимание, что в Windows дочерние процессы наследуют только уровень регистратора родительского процесса - любые другие настройки регистратора не будут унаследованы.
multiprocessing.log_to_stderr()
:Функция multiprocessing.log_to_stderr()
выполняет вызов multiprocessing.get_logger()
, но помимо возврата регистратора, созданного get_logger()
, она добавляет обработчик, который отправляет вывод в sys.stderr
в формате '[%(levelname)s/%(processName)s] %(message)s'
.
Ниже приведен пример сеанса с включенным режимом ведением журнала. Полную таблицу уровней ведения журнала смотрите в модуле logging
.
>>> import multiprocessing, logging
>>> logger = multiprocessing.log_to_stderr()
>>> logger.setLevel(logging.INFO)
>>> logger.warning('doomed')
# [WARNING/MainProcess] doomed
>>> m = multiprocessing.Manager()
# [INFO/SyncManager-...] child process calling self.run()
# [INFO/SyncManager-...] created temp directory /.../pymp-...
# [INFO/SyncManager-...] manager serving at '/.../listener-...'
>>> del m
# [INFO/MainProcess] sending shutdown message to manager
# [INFO/SyncManager-...] manager exiting with exitcode 0