问题
多处理会将日志记录到文件中:
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
1条答案
按热度按时间c8ib6hqw1#
我想了解为什么向某个处理程序写入日志记录仍然会使另一个处理程序混乱。
在Python文档中解释了这一点,假设你谈论的是与文件相关的处理程序。你可以将
QueueHandler
与QueueListener
一起使用,或者你可以将SocketHandler
与一个合适的监听器一起使用。文档中包含了在生产环境中运行日志套接字监听器的信息,甚至还有一个指向a Gist的链接,你可以下载这些文件,并根据自己的需要进行实验/调整。