dask的本地调度程序和gevent

时间:2017-02-28 05:08:27

标签: python gevent dask

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

1 个答案:

答案 0 :(得分:1)

Dask.distributed使用Tornado进行并发,而计算则在其他线程中进行。计算和通信都在同一过程中重叠。如果您停止使用正确的线程,则通信将阻塞,直到长时间运行的计算完成。这可能会导致您的工作人员无法响应,因为他们必须等待长时间运行的计算才能与其他工作人员处理通信请求。 numpy / pandas计算释放GIL这一事实只有在您实际使用线程时才有用。

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

dask-scheduler --no-bokeh

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