0

考虑这样一个简单的工作流程:

from dask.distributed import Client
import time

with Client() as client:
    futs = client.map(time.sleep, list(range(10)))

由于上下文管理器将关闭,上述代码将提交并几乎立即取消期货。可以在使用 完成任务之前保持上下文管理器打开client.gather,但这将阻止当前进程中的进一步执行。

我有兴趣在同一个进程中向多个集群(例如本地和分布式)提交任务,最好不要阻塞当前进程。明确定义不同的客户端和集群很简单,但是上下文管理器(每个唯一的客户端/集群一个)也可以吗?

这听起来有点像反模式,但也许只有在计算所有期货运行后才能关闭集群。我试过fire_and_forget也试过 pass shutdown_on_close=False,但这似乎没有实现。

4

1 回答 1

1

对于某些 Dask 集群/调度程序类型,例如dask-cloudprovider ECSCluster,上述使用with块的方法shutdown_on_close=False可以正常工作。

两者ECSClusterSLURMCluster都派生自SpecCluster。但是,通过此调用ECSCluster将其**kwargs(包括shutdown_on_close)传递给SpecCluster构造函数:

super().__init__(**kwargs)

(见这里ECSCluster的代码)

SLURMCluster没有:它调用构造函数,而构造函数又只使用其参数的子集进行JobQueueCluster实例化:SpecCluster

super().__init__(
    scheduler=scheduler,
    worker=worker,
    loop=loop,
    security=security,
    silence_logs=silence_logs,
    asynchronous=asynchronous,
    name=name,
)

请参阅此处JobQueueCluster的代码

因此SLURMCluster/JobQueueCluster忽略shutdown_on_close(和其他可选参数)。看起来JobQueueCluster您的用例需要更新。

于 2021-05-08T08:38:03.580 回答