在我的一个脚本中,我有类似的东西:
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.Parallel
与prefer="processes"
选项一起使用时,子进程不会继承主进程的日志记录配置。