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