在dask生成的进程中调用dask

时间:2017-01-17 20:43:21

标签: python multiprocessing dask

我们有一个包含大量任务的大型项目。我们使用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或其他方法来安排和懒惰地运行自己的任务。

请注意,在我们的系统中,有许多任务将使用多处理来运行自己的任务。因此顺序执行不是一种选择。

1 个答案:

答案 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