【发布时间】:2015-03-10 16:23:24
【问题描述】:
在多处理环境中使用单个 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 会发生什么?
【问题讨论】:
-
我看过这部作品的形式有限。我原以为会发生的最糟糕的情况是来自不同进程的某些行可能会交错,而在其他情况下(不是专门针对 Python),如果系统负载过重,这种情况往往会发生。抱歉,这只是一个轶事答案。
标签: python logging multiprocessing stdout