LoginSignup
3
4

More than 3 years have passed since last update.

multiprocessingでサブプロセスのログをメインプロセスから出力する

Last updated at Posted at 2020-06-26

サブプロセスのログをメインプロセスから出力したい時がある。
multiprocessingのget_logger()とloggingのQueueHandler/QueueListenerを使うときれいに実装できたのでメモ。

実装例

import logging
import multiprocessing
from logging.handlers import QueueHandler, QueueListener


# サブプロセスで動く関数
def process(i):
    logger = multiprocessing.get_logger()
    logger.warning(f"num {i}")


def main():
    manager = multiprocessing.Manager()

    # queue作成
    queue = manager.Queue()

    # loggerの設定
    logger = multiprocessing.get_logger()
    logger.setLevel("WARN")
    logger.addHandler(QueueHandler(queue))  # queueに出力するようにする

    console_handler = logging.StreamHandler()
    console_handler.setFormatter(logging.Formatter("%(processName)s %(message)s"))
    listener = QueueListener(queue, console_handler)  # queueを見るようにする
    listener.start()

    # サブプロセス起動
    logger.warning("start!")

    with multiprocessing.Pool(processes=2) as pool:
        results = [pool.apply_async(process, args=(i,)) for i in range(4)]
        for result in results:
            result.wait()

    logger.warning("finish!")

    listener.stop()


if __name__ == "__main__":
    main()

仕組み

メインのlogger(multiprocessing.get_logger())にQueueHandlerを設定してログの出力先をqueueにし、QueueListenerを使ってqueueのログを標準出力に流している。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4