默认的Dask调度程序通过使用线程或进程在一台机器上提供并行性。这是Dask使用的默认选项,因为它不需要设置。使用此调度程序不需要做任何选择或设置任何东西。但是,您可以在线程和进程之间进行选择:
- 多线程:在同一个进程中使用多个线程。这个选项适用于释放GIL的数字代码(如NumPy、Panda、Scikit-Learn、Numba等),因为数据在线程间共享。dask默认支持的调度程序有 dask.array, dask.dataframe, and dask.delayed
- 多进程: 将数据发送到单独的进程进行处理。当操作纯Python对象(比如字符串)或类json的字典数据(这些数据保存在GIL上)时,多进程是很好选择,但是当操作数值数据(比如Pandas DataFrames或NumPy arrays)时就不太好了。使用流程可以避免GIL问题,但也会导致大量的进程间通信,这可能比较慢。dask默认 dask.bag。它有时也使用 dask.dataframe
注意:当处理计算密集型任务时,dask.distributed 调度任务通常是更好的选择。具体请看 dask.distributed on a single machine
- 单线程: 在单线程中执行计算。此选项不提供并行性,但在调试或分析时非常有用。在许多情况下,如果您想更好地理解正在发生的事情,将并行执行转换为顺序执行可能是一个方便的选择
如何选择?
您可以通过设置 scheduler= 关键字,指定以下三个值中的一个来选择这些选项:
- "threads": 在本地进程中使用线程池
- "processes": 使用进程池在拆分的进程之间
- "single-threaded": 在当前线程中使用for循环
你可以用以下任何一种方式指定这些选项:
- 当调用 .compute()
x.compute(scheduler='threads')
- 使用上下文管理器
with dask.config.set(scheduler='threads'):
x.compute()
y.compute()
- 全局设置
dask.config.set(scheduler='threads')
使用分布式调度器
Dask最新的分布式调度程序也可以在一台机器上很好地工作,并提供了更多的功能和诊断。更多信息请参见此页。具体详细内容在this page 。