了解 .fork() 与多处理和日志记录
Understanding .fork() with multiprocessing and logging
我是 运行 一个多处理池,它记录到由主父进程配置的记录器。在一种情况下,我有
def init():
global LOG
LOG = logging.getLogger(__name__)
LOG.setLevel(logging.DEBUG)
def main():
LOG.info("test")
if __name__ == '__main__':
fmt = "%(asctime)s %(name)s %(levelname)s: %(message)s"
logging.basicConfig(format=fmt, datefmt='%m/%d/%Y %I:%M:%S %p')
with multiprocessing.Pool(initializer = init) as pool:
pool.map(main, inputs)
我的主调用线程的标准输出没有打印任何内容。但是,如果我这样做:
fmt = "%(asctime)s %(name)s %(levelname)s: %(message)s"
logging.basicConfig(format=fmt, datefmt='%m/%d/%Y %I:%M:%S %p')
def init():
global LOG
LOG = logging.getLogger(__name__)
LOG.setLevel(logging.DEBUG)
def main():
LOG.info("test")
if __name__ == '__main__':
with multiprocessing.Pool(initializer = init) as pool:
pool.map(main, inputs)
那么我确实有正确的日志记录。我不明白为什么这两件事是不同的。当 python 分叉到工作进程时,子进程应该与父进程相同,因此我们是否在全局命名空间和主执行块中调用 logging.basicConfig 之间不应该有区别。有人可以澄清一下吗?
您的代码非常适合 Linux-es(除了它甚至不会 运行,哈哈)
但是对于 Windows 和 OSX multiprocessing
会产生一个新的 interpeter(参见 the docs)并会尝试导入目标模块。这是你的 __name__ == '__main__'
守卫发挥作用的分叉点(双关语意)——你的 logging
设置在生成的工人中根本没有完成!
我是 运行 一个多处理池,它记录到由主父进程配置的记录器。在一种情况下,我有
def init():
global LOG
LOG = logging.getLogger(__name__)
LOG.setLevel(logging.DEBUG)
def main():
LOG.info("test")
if __name__ == '__main__':
fmt = "%(asctime)s %(name)s %(levelname)s: %(message)s"
logging.basicConfig(format=fmt, datefmt='%m/%d/%Y %I:%M:%S %p')
with multiprocessing.Pool(initializer = init) as pool:
pool.map(main, inputs)
我的主调用线程的标准输出没有打印任何内容。但是,如果我这样做:
fmt = "%(asctime)s %(name)s %(levelname)s: %(message)s"
logging.basicConfig(format=fmt, datefmt='%m/%d/%Y %I:%M:%S %p')
def init():
global LOG
LOG = logging.getLogger(__name__)
LOG.setLevel(logging.DEBUG)
def main():
LOG.info("test")
if __name__ == '__main__':
with multiprocessing.Pool(initializer = init) as pool:
pool.map(main, inputs)
那么我确实有正确的日志记录。我不明白为什么这两件事是不同的。当 python 分叉到工作进程时,子进程应该与父进程相同,因此我们是否在全局命名空间和主执行块中调用 logging.basicConfig 之间不应该有区别。有人可以澄清一下吗?
您的代码非常适合 Linux-es(除了它甚至不会 运行,哈哈)
但是对于 Windows 和 OSX multiprocessing
会产生一个新的 interpeter(参见 the docs)并会尝试导入目标模块。这是你的 __name__ == '__main__'
守卫发挥作用的分叉点(双关语意)——你的 logging
设置在生成的工人中根本没有完成!