Python多进程日志打印

背景

因工作,需开发数据导出工具,数据较多,打算使用多进程方式处理

具体步骤

loguru

  1. 日志格式很美观
  2. 相对于logging的一堆配置,他用起来更加方便;

安装

pip install loguru

方案

由于默认情况下子进程中的日志对象,与主进程的不是同一个logger,所以日志不会打印到同一地方

重点:

  1. 主程序中开日志线程:消费子进程中打印的日志
def log_listener(log_queue):
    while True:
	
    pass
  1. 日志队列需要从Manager对象创建,才可以给进程池共享
with Manager() as manager:
    log_queue = manager.Queue()
    log_thrd = Thread(target=log_listener, args=(log_queue))
    log_thrd.start()

    with Pool() as p:
        r = p.async_apply(func, (log_queue, other_args))
        r.get()

    p.close()
    p.join()

    log_queue.put(None)
    log_thrd.join()

  1. 子进程中需要将日志信息添加到消息队列中
class QueueSink(object):
   def __init__(self, q):
       self.q = q

   def write(self, message):
       # 这是一个神奇的地方:message是Message类型,继承了str,增加了record成员。
       # recorde = message.record
       self.q.put(message)

logger.remove()

logger.add(QueueSink(log_queue))

posted @ 2024-03-08 00:06  小AT  阅读(76)  评论(0编辑  收藏  举报