Python记录儿童过程



我想使用python中的 joblib并行创建一个日志文件。但是,当我尝试以下最简单的示例时,只创建了几个日志文件,并且以随机顺序将所有日志记录消息插入到文件中。我做错了什么?这是Python 3.7.1,Joblib版本为0.13.2。

from joblib import Parallel, delayed
import os
def func(i):
    import logging
    logging.basicConfig(filename='logs/%d.txt' % i)
    logger = logging.getLogger()
    logger.warning('This is task %d' % i)
Parallel(n_jobs=4)(delayed(func)(i) for i in range(16))
for f in os.listdir('logs'):
    r = open('logs/' + f, 'r')
    print(f, 'n', r.read())
    r.close()

输出为:

1.txt 
 WARNING:root:This is task 1
WARNING:root:This is task 13
WARNING:root:This is task 15
0.txt 
 WARNING:root:This is task 0
WARNING:root:This is task 2
WARNING:root:This is task 3
WARNING:root:This is task 4
WARNING:root:This is task 5
WARNING:root:This is task 6
WARNING:root:This is task 7
WARNING:root:This is task 8
WARNING:root:This is task 10
WARNING:root:This is task 11
WARNING:root:This is task 12
WARNING:root:This is task 14
9.txt 
 WARNING:root:This is task 9

如果我了解登录文档正确的 logging.basicConfig仍然适用于" root"Logger,这是问题所在。然后发生的事情是,如果它在代码中的0.txt或1.txt中列出了每个新过程(如@ironman的回答(,则取决于每个新过程的何时产生。因此,您需要在创建的每个新记录器中添加一个文件手。这样的东西:

import logging
from joblib import Parallel, delayed
import os
def func(i):
    logger = logging.getLogger(f"logger_{i}")
    # change 'mode' if appropriate for your situation ('a' is for append)
    logger.addHandler(logging.FileHandler(f"logs/{i}.txt", mode='a')) 
    logger.warning(f'This is task {i}')               
Parallel(n_jobs=4)(delayed(func)(i) for i in range(16))
for f in os.listdir('logs'):
    r = open('logs/' + f, 'r')
    print(f, 'n', r.read())
    r.close()

有关更多信息,请查看官方文档中的HOWTO:https://docs.python.org/3/howto/logging.html

希望它起作用(回答比没有更好(。

basicConfig如果已经配置了根处理程序,则无能为力,因此每个过程都会生效一次。该文件将根据传递给该过程的第一个参数创建。任务的分布将取决于流程消耗每个任务的速度,这可能是随机的 - 因此您不能保证每个过程数量的任何特定数量的过程或任务。

相关内容

  • 没有找到相关文章

最新更新