dask 的本地调度器和 gevent

dask's local scheduler and gevent

我正在使用 distributed.Client 进行一些本地计算。我还想从主线程生成一个 gevent greenlet 来做一些不相关的监控。使用 gevent 的 patch_all() 方法,将本机线程变成 greenlets。鉴于调度程序完成的大部分工作是 pandas/numpy,因此我怀疑其中大部分都释放了 GIL,本机线程会很有用。我担心让 gevent 修补它们将完全不是最佳选择。然而,不修补本机线程给我带来了其他麻烦(具体来说,当本地调度程序尝试分叉 Bokeh 服务器时抛出错误。这是一个已知的限制)。使用 gevent 和 dask/distributed 时是否有建议的最佳实践,还是应该避免?

Dask.distributed 使用 Tornado 进行并发,而计算发生在其他线程中。计算和通信在同一个进程中重叠。如果您停止使用适当的线程,那么通信将阻塞,直到 long-运行 计算完成。这可能会导致您的工作人员变得无响应,因为他们必须等待 long-运行 计算才能处理与其他工作人员的通信请求。 numpy/pandas 计算释放 GIL 这一事实仅在您实际使用线程时才有用。

如果分叉 bokeh 服务器是一个问题,您也可以选择不使用带有 --no-bokeh 标志的 bokeh 网络服务器。

dask-scheduler --no-bokeh

或者,简而言之,dask.distributed 没有使用 gevent 进行测试,也没有支持它的计划。