gpt4 book ai didi

python - 我可以使用 StreamHandler 在 Python 的多处理环境中登录吗?

转载 作者:太空宇宙 更新时间:2023-11-04 05:53:30 26 4
gpt4 key购买 nike

使用单个 StreamHandler 是否安全?在多处理环境中?

更准确地说,只有一个 StreamHandler 可以简单地将所有进程的日志记录打印到 stdout 吗?像这样,例如:

import multiprocessing as mp
import logging


def do_log(no):
# 2nd EDIT, suppose we do also this,
# which should not have any effect if there already exists a
# handler! But it probably has under Windows:
format = '%(processName)-10s %(name)s %(levelname)-8s %(message)s'
# This creates a StreamHandler
logging.basicConfig(format=format, level=logging.INFO)

# root logger logs Hello World
logging.getLogger().info('Hello world {}'.format(no))


def main():
format = '%(processName)-10s %(name)s %(levelname)-8s %(message)s'
# This creates a StreamHandler
logging.basicConfig(format=format, level=logging.INFO)

n_cores = 4
pool = mp.Pool(n_cores)
# Log to stdout 100 times concurrently
pool.map(do_log, range(100))
pool.close()
pool.join()


if __name__ == '__main__':
main()

这将打印如下内容:

ForkPoolWorker-1 root INFO     Hello world 0
ForkPoolWorker-3 root INFO Hello world 14
ForkPoolWorker-3 root INFO Hello world 15
ForkPoolWorker-3 root INFO Hello world 16
...

这是一个安全的设置吗?如果不是会出现什么问题?更严重的事而不是乱码的控制台输出,即程序崩溃?

如果安全的话,使用mp.Process代替mp.Pool时是否仍然安全?

编辑:我的问题涉及任何操作系统,因此如果 Linux、OSX 或 Windows 之间存在差异,请不要犹豫告诉我。

第二次编辑: 好的,所以在 Windows 下处理程序消失了,如果我们为每个进程创建一个新的 StreamHandler 会怎样?

最佳答案

此代码在 Windows 上根本不起作用,这对您来说可能是问题,也可能不是问题。因为 Windows 没有 fork,所以您在父级中进行的记录器自定义不会被子级正确继承。

在 Linux/OS X 上,唯一的问题是来自不同进程的消息混杂在一起。 多处理 文档 mentions that when discussing logging :

Some support for logging is available. Note, however, that the logging package does not use process shared locks so it is possible (depending on the handler type) for messages from different processes to get mixed up.

mp.Pool 是使用 mp.Process 实现的,因此它们在这里的行为完全相同。

编辑:

如果您想要与此基本等价的东西也可以在 Windows 上运行,则需要在每个子进程以及父进程中运行日志记录配置:

import multiprocessing as mp
import logging


def do_log(no):
# root logger logs Hello World
logging.getLogger().info('Hello world {}'.format(no))

def init_log():
fmt = '%(processName)-10s %(name)s %(levelname)-8s %(message)s'
logging.basicConfig(format=fmt, level=logging.INFO)

def main():
# This creates a StreamHandler
init_log()
n_cores = 4
pool = mp.Pool(n_cores, initializer=init_log)
# Log to stdout 100 times concurrently
pool.map(do_log, range(100))
pool.close()
pool.join()


if __name__ == '__main__':
main()
logging.getLogger().info("hi")

这会给您带来与原始版本在 Linux 上相同的问题(日志消息会出现乱码)。

关于python - 我可以使用 StreamHandler 在 Python 的多处理环境中登录吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28968951/

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