2

Python のマルチプロセッシングを使用してプロセスを生成するためのモジュールを作成しています。モジュールの一部は、ワーカー プロセスを作成し、それらのプロセスから結果キューに結果を返すことに焦点を当てています。モジュールのロギングは、TCP SocketHandler および StreamHandler を使用して行われます。

問題は、ロギングが常に機能するわけではなく、時々機能することです。実際のマルチプロセス モジュールは期待どおりに動作しますが、ログ コンソールに出力ログが一貫して表示されません。すべてまたはほとんどのログが表示される場合があります。ただし、ログの一部のみが表示されるまで、ログが定期的に、または最終的に消える可能性があります。さらに、個別のモジュールを実行すると、期待どおりにログが記録され、すべてのログが表示されます。

私の現在のテストを表すコード スニペットは以下のとおりです。

#Check process list for dead processes
def clean_process_list(self):
    logger.info("Checking for dead or orphaned processes.")
    if len(self.processes):
        for i in range(0, len(self.processes)):
            process = self.processes.pop()
            if process.is_alive() is not True:
                logger.info("{} is unresponsive; terminating process.".format(process.name))
                process.terminate()
            else:
                self.processes.appendleft(process)

#Worker method which puts results from a target method into a queue, if any exist. Self-terminates on completion.
def worker(self, args):
    worker_name = multiprocessing.current_process().name
    logging_socket = tcp_log_socket.local_logging_socket('test.json', worker_name) #reinitializing logger in worker for troubleshooting
    logger = logging_socket.logger
    logger.info("Running process {}; waiting for results.".format(worker_name))
    results = self.target_method(*args)
    results_queue = self.process_results
    logger.info("Ran target method, storing results and name of finished process.")
    results_queue.put([results, worker_name])
    logger.info("Process {} completed, exiting.".format(worker_name))
    sys.exit(0)

#Creates and uses a process to run a job using the assigned target method. 
def use_process(self, args):
    self.clean_process_list()
    self.process_results = multiprocessing.Queue()
    process = multiprocessing.Process(target=self.worker, args=(args,))
    logger.info("Created process; process name is {}".format(process.name))
    self.processes.append(process)
    process.start()
    logger.info("Process {} started.".format(process.name))

予想されるログ出力と予想外の出力を以下に示します。

理想的な出力:

デッドまたは孤立したプロセスをチェックしています。

プロセス 1 が応答しません。終了プロセス。

作成されたプロセス; プロセス名は Process-2

プロセス-2 が開始されました。

実行中のプロセス Process-2; 結果待ち。

ターゲット メソッドを実行し、結果と終了したプロセスの名前を保存します。

合計: 5

プロセス Process-2 が完了しました。終了します。

予期しない出力

デッドまたは孤立したプロセスをチェックしています。

作成されたプロセス; プロセス名は Process-2

実行中のプロセス Process-2; 結果待ち。

合計: 5

さらに悪いことに:

合計: 5

上記で、ロガーの基本的な構成 (つまり、ログ レベルの設定) は既に完了しており、ロギング サーバーは、不完全な (短い) メッセージを受信した場合に完全なレコードを取得するように構成されています。

この問題の症状や根本原因を知っている人はいますか?

編集: ロギング コードは、複数プロセスの Python ロギング クックブックに掲載されているコードとほぼ同じであることに注意してください: https://docs.python.org/3/howto/logging-cookbook.html

4

0 に答える 0