开发者问题收集

dask 使用延迟构造函数列表,但指定要使用的进程数

2017-02-23
147

我有一个函数用于计算,下面是一个简单的示例,

def add(a,b):
    return a+b

然后我以令人尴尬的并行方式执行此函数 100 次,

output = [delayed(add)(i,i+1) for i in range(100)]
compute(*output)

我的问题是上面的代码会启动 100 个进程吗?如果是这样,有没有办法让它启动 10 个进程,从而减少启动进程的时间?

2个回答

dask delayed 的默认 get 是一个线程池,其线程数与核心数相同。

您可以使用不同的 get (而不是线程的),也可以通过 compute 指定 get 参数。要使用具有 10 个线程的线程池,您可以执行 dask.compute(*output, num_workers=10) 。要使用基于 multiprocessing 模块的具有 10 个工作线程的 get,您可以执行 dask.compute(*output, get=dask.multiprocessing.get, num_workers=10) 。 (请注意, dask.multiprocessing 所基于的多处理模块并不是 stdlib 中最大的瑰宝。Dask 的使用可能很少见,如果您以非常简单的方式使用它,它应该大部分时间都可以工作,但如果我需要使用 dask 实现基于进程的并行性,我会很快使用 分布式 ,即使在单个主机上也是如此。)

Mike Graham
2017-02-23

默认调度程序会启动线程池或进程池,其线程/进程数量与您机器上的逻辑核心数量相同(尽管这是可配置的)。Dask 不会启动与任务数量一样多的进程;正如您所建议的,这将非常低效。

您可以在 此文档页面 了解有关 Dask 调度程序的更多信息。

MRocklin
2017-02-23