python-3.x 多处理会使记录到文件变得混乱

fdbelqdn  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(177)

问题

多处理会将日志记录到文件中:
1.可以删除已写入的行
1.不能写入新行
1.行的顺序可能不正确
如果不使用多处理,日志记录工作正常。
我读到我可以使用QueueHandler,但是我想理解为什么向某个处理程序写入日志仍然会使另一个处理程序混乱。

要重现的代码

设置USE_MP=False或取消注解exit(),以验证只要不执行多处理行,日志记录就能正常工作。

import logging
import multiprocessing
import time
from multiprocessing import Pool
from typing import Dict, List

USE_MP = True

logger = logging.getLogger()
logger.addHandler(logging.FileHandler(filename="test.log", mode="w"))
logger.setLevel(logging.DEBUG)

mplogger = multiprocessing.log_to_stderr()
mplogger.addHandler(logging.StreamHandler())
mplogger.setLevel(logging.DEBUG)

def time_consuming_function(file_name):
    logger.info(f"Running time_consuming_function with {file_name}")
    time.sleep(1)
    return file_name, file_name

def mp(file_names: List[str]) -> Dict[str, str]:
    logger.info(f"Running mp...")
    with Pool() as p:
        return {
            file_name: file_name
            for file_name, file_name in p.imap_unordered(
                time_consuming_function, file_names
            )
        }

def non_mp(file_names: List[str]) -> Dict[str, str]:
    logger.info(f"Running non-mp...")
    return {
        file_name: file_name
        for file_name, file_name in map(time_consuming_function, file_names)
    }

def main():
    logger.info("Start run...")
    file_names = list("ABCDE")
    # exit()
    if USE_MP:
        mp(file_names)
    else:
        non_mp(file_names)
    logger.info("End run.")

if __name__ == "__main__":
    main()

Python版本:3.7

c8ib6hqw

c8ib6hqw1#

我想了解为什么向某个处理程序写入日志记录仍然会使另一个处理程序混乱。
在Python文档中解释了这一点,假设你谈论的是与文件相关的处理程序。你可以将QueueHandlerQueueListener一起使用,或者你可以将SocketHandler与一个合适的监听器一起使用。文档中包含了在生产环境中运行日志套接字监听器的信息,甚至还有一个指向a Gist的链接,你可以下载这些文件,并根据自己的需要进行实验/调整。

相关问题