如何为子流程启用日志记录

时间:2020-06-28 12:24:39

标签: python python-3.x logging multiprocessing

这是一个简单的脚本:

import logging
import multiprocessing
    
def run(i):
    logging.info(i)

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    pool = multiprocessing.Pool(processes=2)

    logging.info('Sequential:')
    for i in range(3):
        run(i)

    logging.info('Parallel:')
    for i in range(3):
        pool.apply_async(run, [i])

    logging.info('Done')
    pool.close()
    pool.join()

输出如下:

INFO:root:Sequential:
INFO:root:0
INFO:root:1
INFO:root:2
INFO:root:Parallel:
INFO:root:Done

为什么子进程什么都不输出?如何解决?

complicated tutorials很多。有没有更简单的方法登录到stdout / stderr?

似乎multiprocessing_logging模块在​​Windows上不起作用。所以我不能使用它。

1 个答案:

答案 0 :(得分:0)

即使没有multiprocessing_logging模块,它也可以正常工作。应该为每个子流程配置记录器。请查看添加到run()的第一行。这是完整的代码:

import logging
import multiprocessing

def run(i):
    logging.basicConfig(format=logging.BASIC_FORMAT, level=logging.INFO)
    logging.info(i)

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    pool = multiprocessing.Pool(processes=2)

    logging.info('Sequential:')
    for i in range(3):
        run(i)

    logging.info('Parallel:')
    for i in range(3):
        pool.apply_async(run, [i])

    logging.info('Done')
    pool.close()
    pool.join()

我想无论如何都应该使用multiprocessing_logging来解决由对stdout / stderr的一致访问引起的问题。