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