Python多进程日志打印
背景
因工作,需开发数据导出工具,数据较多,打算使用多进程方式处理
具体步骤
loguru
- 日志格式很美观
- 相对于logging的一堆配置,他用起来更加方便;
安装
pip install loguru
方案
由于默认情况下子进程中的日志对象,与主进程的不是同一个logger,所以日志不会打印到同一地方
重点:
- 主程序中开日志线程:消费子进程中打印的日志
def log_listener(log_queue):
while True:
pass
- 日志队列需要从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()
- 子进程中需要将日志信息添加到消息队列中
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))