В модуле 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