> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 다중 처리 인식 로깅을 구현하는 방법: 대기열 기반 솔루션?

Python에서 다중 처리 인식 로깅을 구현하는 방법: 대기열 기반 솔루션?

Susan Sarandon
풀어 주다: 2024-10-30 12:14:02
원래의
674명이 탐색했습니다.

  How to Implement Multiprocessing-Aware Logging in Python: A Queue-Based Solution?

Python에서 다중 처리 인식 로깅을 구현하는 방법

Python에서 다중 처리를 사용하면 독립적으로 실행되는 여러 프로세스를 생성할 수 있습니다. 그러나 로그 파일과 같은 공유 리소스에 액세스하는 것은 여러 프로세스가 동시에 쓰기를 시도할 수 있으므로 복잡해질 수 있습니다.

이 문제를 방지하기 위해 Python 다중 처리 모듈은 모듈 수준 다중 처리 인식 로깅 기능을 제공합니다. 이를 통해 로거는 한 번에 하나의 프로세스만 특정 파일 설명자에 기록하도록 하여 로그 메시지 왜곡을 방지할 수 있습니다.

그러나 프레임워크 내의 기존 모듈은 다중 처리를 인식하지 못할 수 있으므로 다음이 필요합니다. 대체 솔루션을 위해. 한 가지 접근 방식은 파이프를 통해 상위 프로세스에 로깅 메시지를 보내는 사용자 정의 로그 핸들러를 생성하는 것입니다.

이 접근 방식의 구현은 아래에 제공됩니다.

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)

        # Set up the file handler for the parent process
        self._handler = RotatingFileHandler(name, mode, maxsize, rotate)
        
        # Create a queue to receive log messages from child processes
        self.queue = multiprocessing.Queue(-1)
        
        # Start a thread in the parent process to receive and log messages
        t = threading.Thread(target=self.receive)
        t.daemon = True
        t.start()

    def receive(self):
        while True:
            try:
                # Get a log record from the queue
                record = self.queue.get()
                
                # Log the record using the parent process's file handler
                self._handler.emit(record)
            # Exit the thread if an exception is raised
            except (KeyboardInterrupt, SystemExit):
                raise
            except EOFError:
                break
            except:
                traceback.print_exc(file=sys.stderr)

    def send(self, s):
        # Put the log record into the queue for the receiving thread
        self.queue.put_nowait(s)

    def _format_record(self, record):
        # Stringify any objects in the record to ensure that they can be sent over the pipe
        if record.args:
            record.msg = record.msg % record.args
            record.args = None
        if record.exc_info:
            dummy = self.format(record)
            record.exc_info = None
            
        return record

    def emit(self, record):
        try:
            # Format and send the log record through the pipe
            s = self._format_record(record)
            self.send(s)
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)

    def close(self):
        # Close the file handler and the handler itself
        self._handler.close()
        logging.Handler.close(self)
로그인 후 복사

이 사용자 정의 로그 핸들러는 모듈을 허용합니다. 프레임워크 내에서 자체적으로 다중 처리를 인식하지 않고도 표준 로깅 방식을 사용할 수 있습니다. 로그 메시지는 파이프를 통해 하위 프로세스에서 상위 프로세스로 전송되어 메시지가 왜곡되지 않고 로그 파일에 올바르게 기록되도록 합니다.

위 내용은 Python에서 다중 처리 인식 로깅을 구현하는 방법: 대기열 기반 솔루션?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿