Python でマルチプロセッシング対応ロギングを実装する方法
Python のマルチプロセッシングを使用すると、独立して実行される複数のプロセスを作成できます。ただし、ログ ファイルなどの共有リソースへのアクセスは、複数のプロセスが同時に書き込みを試行する可能性があるため、複雑になる可能性があります。
この問題を回避するために、Python マルチプロセッシング モジュールは、モジュール レベルのマルチプロセッシング対応ログ機能を提供します。これにより、ロガーは一度に 1 つのプロセスのみが特定のファイル記述子に書き込まれるようにすることで、ログ メッセージの文字化けを防ぐことができます。
ただし、フレームワーク内の既存のモジュールはマルチプロセスを認識していない可能性があるため、代替ソリューションについては。 1 つのアプローチには、パイプ経由で親プロセスにログ メッセージを送信するカスタム ログ ハンドラーを作成することが含まれます。
このアプローチの実装を以下に示します。
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 中国語 Web サイトの他の関連記事を参照してください。