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