Ведение журнала многопроцессорной обработки в Python
При использовании модуля многопроцессорной обработки Python важно учитывать методы ведения журнала, чтобы избежать ошибок, вызванных записью нескольких процессов в один и тот же дескриптор файла одновременно. По умолчанию регистратор с поддержкой многопроцессорной обработки, предоставляемый mp.get_logger(), обеспечивает правильные механизмы блокировки в sys.stderr.
Однако модули, которые не поддерживают многопроцессорную обработку, могут нуждаться в модификациях для использования ведения журнала с поддержкой многопроцессорной обработки. Чтобы избежать этих изменений, рассмотрите альтернативные подходы:
Пользовательский обработчик журналов
Один подход — создать собственный обработчик журналов, который отправляет журналы родительскому процессу через канал. Это позволяет модулям использовать стандартный модуль журналирования, в то время как родительский процесс занимается фактическим журналированием. Вот реализация:
from logging.handlers import RotatingFileHandler
import multiprocessing, threading, logging, sys, traceback
class MultiProcessingLog(logging.Handler):
def __init__(self, name, mode, maxsize, rotate):
logging.Handler.__init__(self)
self._handler = RotatingFileHandler(name, mode, maxsize, rotate)
self.queue = multiprocessing.Queue(-1)
t = threading.Thread(target=self.receive)
t.daemon = True
t.start()
Обработчик получает записи журнала от дочерних процессов и записывает их в файл, используя предоставленный обработчик файлов. Это обеспечивает централизованное ведение журнала без необходимости внесения изменений в зависимые модули.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3