gpt4 book ai didi

python - 多处理上下文中 Python 日志记录模块的混淆行为

转载 作者:行者123 更新时间:2023-11-28 22:48:38 28 4
gpt4 key购买 nike

所以我尝试在 multiprocessing 上下文中使用 logging。假设我想让每个进程写入自己的日志文件。这是我的设置:

# worker.py
import logging
import os

def worker( x ) :
"""
Write the value of x in the log file
"""
logger = logging.getLogger( __name__ )
pid = os.getpid() # get the process id
handler = logging.FileHandler( str(pid) + ".log" )
logger.addHandler( handler )
logger.info( "pid={pid}, x={x}".format( **locals() ) )

这是我的主要:

import logging
import multiprocessing as mp
import worker

# logger
logger = logging.getLogger()
logger.setLevel( logging.INFO )

# handler
handler = logging.FileHandler( 'main.log' )
logger.addHandler( handler )

#
if __name__ == '__main__' :
pool = mp.Pool( processes=2 )
pool.map( worker.worker, range(5) )
pool.close()
pool.join()

现在是输出日志文件。这是 main.log:

pid=1985, x=0
pid=1985, x=2
pid=1986, x=1
pid=1985, x=3
pid=1986, x=4

我认为这个输出是正常的:两个子进程将事件传播到根父进程。所以它对应于Logging to a single file from multiple processes场景(是吗?)。但现在这里是第一个子进程日志文件:

pid=1985, x=0
pid=1985, x=2
pid=1985, x=2
pid=1985, x=3
pid=1985, x=3
pid=1985, x=3

这是第二个子日志文件:

pid=1986, x=1
pid=1986, x=4
pid=1986, x=4

看起来每个子进程都为第一个输入写入日志一次,第二个输入两次,第三个输入三次,等等。这是怎么回事?

最佳答案

发生这种情况是因为每次您输入 worker 时,您都会获得对同一个 logger 对象的引用,然后添加一个新的 FileHandler给它。因此,如果 worker 被调用三次,它的 logger 最终会拥有三个 FileHandlers,它们都碰巧写入同一个文件。您应该在启动时使用 initializer 关键字参数在每个 Pool 进程中设置记录器:

def init( ) :
logger = logging.getLogger( __name__ )
pid = os.getpid() # get the process id
handler = logging.FileHandler( str(pid) + ".log" )
logger.addHandler( handler )

然后像这样启动池

 p = multiprocessing.Pool(processes=2, initializer=init)

然后 worker 可以只获取 logger 对象并使用它,而无需向其添加 FileHandler

关于python - 多处理上下文中 Python 日志记录模块的混淆行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24841229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com