升级分发到版本1.15.0的dask后,我的日志记录停止了工作。
我已经使用logging.config.dictConfig来初始化python日志工具,之前这些设置已传播给所有工作者。但升级后它不再起作用了。
如果我在每个日志调用之前对每个工作人员进行dictConfig工作,但它不是一个合适的解决方案。
所以问题是如何在我的计算图开始执行之前初始化每个worker的登录,并且每个worker只执行一次?
更新
这个黑客工作是一个虚拟的例子,但对我的系统没有任何影响:
def init_logging():
# logging initializing happens here
...
client = distributed.Client()
client.map(lambda _: init_logging, client.ncores())
更新2:
在深入了解文档后,解决了这个问题:
client.run(init_logging)
现在的问题是:这是解决这个问题的正确方法吗?
答案 0 :(得分:4)
从版本1.15.0开始,我们现在从一个干净的流程中派遣工人,因此在调用Client()
之前对流程所做的更改不会影响派生工作者。有关详细信息,请在此处搜索forkserver
:https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods
您使用Client.run
的解决方案对我来说很好看。 Client.run目前(从版本1.15.0开始)是在所有当前活动的工作程序上调用函数的最佳方法。
值得注意的是,您可以在一台计算机上设置从同一进程分叉的客户端。您在上面使用的技巧将无法在分布式设置中使用。如果有人问到如何在集群环境中使用Dask处理日志记录,我会添加此笔记。
通常Dask不会移动日志。相反,通常用于启动Dask的任何机制都会处理此问题。像SGE / SLURM / Torque / PBS这样的作业调度程序都可以执行此操作。像YARN / Mesos / Marathon / Kubernetes这样的云系统都是这样做的。 dask-ssh
工具执行此操作。