共享内存
异步调度器接受任何 concurrent.futures.Executor
实例。这包括 Python 标准库中定义的 ThreadPoolExecutor
和 ProcessPoolExecutor
实例,以及来自第三方库的任何其他子类。Dask 还定义了自己的 SynchronousExecutor
,它只在主线程上运行函数(对调试很有用)。
完整的 Dask get
函数分别存在于 dask.threaded.get
、dask.multiprocessing.get
和 dask.get
中。
策略
异步调度器维护索引数据结构,这些结构显示哪些任务依赖于哪些数据,哪些数据可用,哪些数据在等待哪些任务完成后才能释放,以及哪些任务当前正在运行。相对于总任务数和可用任务数,它可以在常数时间内更新这些信息。这些索引结构使得 Dask 异步调度器能够在单台机器上扩展到非常多的任务。
为了保持较小的内存占用,我们选择将就绪任务保存在后进先出栈中,以便最近可用的任务获得优先权。这鼓励在开始新链之前完成相关任务链。这也可以在常数时间内查询。
已知限制
共享内存调度器有一些显著的限制
它在单台机器上工作
线程调度器受 Python 代码的 GIL 限制,因此如果您的操作是纯 Python 函数,您不应该期望多核加速
多进程调度器必须在 Worker 之间序列化函数,这可能会失败
多进程调度器必须在 Worker 和中心进程之间序列化数据,这可能会很昂贵
多进程调度器无法直接在 Worker 进程之间传输数据;所有数据都通过主进程路由。