我们有一个包含大量任务的大型项目。我们使用dask图来安排每个任务。该图的一小部分样本如下。请注意,dask设置为多处理模式。
dask_graph:
universe: !!python/tuple [gcsstrategies.svc.business_service.UniverseService.load_universe_object, CONTEXT]
raw_market_data: !!python/tuple [gcsstrategies.svc.data_loading_service.RDWLoader.load_market_data, CONTEXT, universe]
raw_fundamental_data: !!python/tuple [gcsstrategies.svc.data_loading_service.RDWLoader.load_fundamental_data, CONTEXT, universe]
dask_keys: [raw_fundamental_data]
现在其中一项任务raw_fundamental_data
懒惰地使用@delay
计划任务任务并使用dask.compute()
运行它们。这个设计选择的原因是将在raw_fundamental_data
内调度和延迟运行的任务列表在运行时根据运行时参数动态选择。
我们看到的错误是:
守护进程不允许有孩子
我们理解这是因为一个衍生过程正试图产生孩子。有没有解决这个问题的方法? dask是否有任何方法允许通过daskgraph安排的任务使用@delay
或其他方法来安排和懒惰地运行自己的任务。
请注意,在我们的系统中,有许多任务将使用多处理来运行自己的任务。因此顺序执行不是一种选择。
答案 0 :(得分:3)
多处理调度程序无法进行此类操作。但是,distributed scheduler(您也可以在一台计算机上轻松使用分布式调度程序。
相关文档页面在这里:
In [1]: from dask.distributed import Client, local_client
In [2]: def f(n):
...: with local_client() as lc:
...: futures = [lc.submit(lambda x: x + 1, i) for i in range(n)]
...: total = lc.submit(sum, futures)
...: return total.result()
...:
In [3]: c = Client() # start processes on local machine
In [4]: future = c.submit(f, 10)
In [5]: future.result()
Out[5]: 55
这使用concurrent.futures接口来进行dask而不是dask.delayed,但你也可以使用dask.delayed。见http://distributed.readthedocs.io/en/latest/manage-computation.html