dask 使用 delayed 构造函数列表,但指定要使用的进程数
dask using delayed to construct a list of functions but specify the number of process to use
我有一个计算函数,这里有一个简单的例子,
def add(a,b):
return a+b
然后我以令人尴尬的并行方式执行此函数 100 次,
output = [delayed(add)(i,i+1) for i in range(100)]
compute(*output)
我的问题是上面的代码会启动100个进程吗?如果是这样,有没有办法让它启动 10 个进程,从而减少启动进程的时间?
默认调度程序启动的线程池或进程池的数量 threads/processes 与您机器上的逻辑核心数相同(尽管这是可配置的)。 Dask 不会启动与您有任务一样多的进程;正如你所建议的,这将是非常低效的。
您可以在 this doc page 了解更多关于 Dask 调度程序的信息。
dask delayed 的默认值 get
是一个线程池,线程数与内核数一样多。
您可以使用不同的 get
(而不是线程的)以及通过 compute
指定 get
参数。要使用具有 10 个线程的线程池,您可以这样做 dask.compute(*output, num_workers=10)
。要对 10 个工人使用基于 multiprocessing
模块的 get,您可能需要 dask.compute(*output, get=dask.multiprocessing.get, num_workers=10)
。 (请注意,dask.multiprocessing
所基于的多处理模块并不是 stdlib 中最大的 gem。Dask 的使用可能很少见,如果你以一种非常简单的方式使用它,它应该主要工作,但如果我需要与 dask 的基于进程的并行性,我会很快使用 Distributed,即使在单个主机上也是如此。)
我有一个计算函数,这里有一个简单的例子,
def add(a,b):
return a+b
然后我以令人尴尬的并行方式执行此函数 100 次,
output = [delayed(add)(i,i+1) for i in range(100)]
compute(*output)
我的问题是上面的代码会启动100个进程吗?如果是这样,有没有办法让它启动 10 个进程,从而减少启动进程的时间?
默认调度程序启动的线程池或进程池的数量 threads/processes 与您机器上的逻辑核心数相同(尽管这是可配置的)。 Dask 不会启动与您有任务一样多的进程;正如你所建议的,这将是非常低效的。
您可以在 this doc page 了解更多关于 Dask 调度程序的信息。
dask delayed 的默认值 get
是一个线程池,线程数与内核数一样多。
您可以使用不同的 get
(而不是线程的)以及通过 compute
指定 get
参数。要使用具有 10 个线程的线程池,您可以这样做 dask.compute(*output, num_workers=10)
。要对 10 个工人使用基于 multiprocessing
模块的 get,您可能需要 dask.compute(*output, get=dask.multiprocessing.get, num_workers=10)
。 (请注意,dask.multiprocessing
所基于的多处理模块并不是 stdlib 中最大的 gem。Dask 的使用可能很少见,如果你以一种非常简单的方式使用它,它应该主要工作,但如果我需要与 dask 的基于进程的并行性,我会很快使用 Distributed,即使在单个主机上也是如此。)