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

luc*_*one 19 python logging python-logging

在我的一个脚本中,我有类似的内容:

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()
Run Code Online (Sandbox Code Playgroud)

我希望当我运行python script.py类似的东西时:

INFO:root:f_B
INFO:root:f_A
Run Code Online (Sandbox Code Playgroud)

显示在控制台中,而不是我看到:

INFO:root:f_B
Run Code Online (Sandbox Code Playgroud)

f_A但没有显示任何信息。

我怎样才能f_A——以及最终从那里调用的函数——显示在日志中?

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

INFO:root:f_B
INFO:root:f_A
Run Code Online (Sandbox Code Playgroud)

然后一切都会按预期进行。

小智 1

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