Log de multiprocessamento em Python
Ao usar o módulo de multiprocessamento do Python, é importante considerar práticas de log para evitar erros causados por vários processos gravando no mesmo identificador de arquivo simultaneamente. Por padrão, o registrador com reconhecimento de multiprocessamento fornecido por mp.get_logger() garante mecanismos de bloqueio adequados em sys.stderr.
No entanto, módulos que não reconhecem multiprocessamento podem precisar de modificações para usar o log com reconhecimento de multiprocessamento. Para evitar essas alterações, considere abordagens alternativas:
Manipulador de log personalizado
Uma abordagem é criar um manipulador de log personalizado que envia logs para o processo pai por meio de um canal. Isso permite que os módulos usem o módulo de registro padrão enquanto o processo pai lida com o registro real. Aqui está uma implementação:
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()
O manipulador recebe registros de log dos processos filhos e os grava em um arquivo usando o manipulador de arquivo fornecido. Isso garante o registro centralizado sem a necessidade de fazer alterações nos módulos dependentes.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3