使用 joblib 并行和延迟调用记录嵌套函数



在我的一个脚本中,我有类似的东西:

import logging
from joblib import Parallel, delayed
def f_A(x):
logging.info("f_A "+str(x))
def f_B():
logging.info("f_B")
res = Parallel(n_jobs=2, prefer="processes")(delayed(f_A)(x) for x in range(10))

if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
f_B()

我希望当我运行时python script.py类似以下内容:

INFO:root:f_B
INFO:root:f_A

显示在控制台中,相反,我看到:

INFO:root:f_B

但没有显示来自f_A的信息。

如何让f_A- 以及最终从那里调用的函数 - 显示在日志中?

我认为问题是由于默认日志记录级别为 DEBUG 并且主进程不共享将该级别传播到子级。如果将脚本稍微修改为:

import logging
from joblib import Parallel, delayed
def f_A(x):
logging.basicConfig(level=logging.INFO)
logging.info("f_A "+str(x))
def f_B():
logging.info("f_B")
res = Parallel(n_jobs=2, prefer="processes")(delayed(f_A)(x) for x in range(10))

if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
f_B()

然后一切都按预期工作。

您是对的,该问题是由于日志记录级别未传播到子进程。在原始脚本中,仅在主进程中调用basicConfig。将joblib.Parallelprefer="processes"选项一起使用时,子进程不会继承主进程的日志记录配置。