2017-02-28 56 views
1

我使用distributed.Client做一些局部計算。我也想從主線程產生一個gevent greenlet來做一些無關的監測。使用gevent的patch_all()方法,將把本地線程轉化爲greenlet。鑑於調度程序完成的大部分工作是熊貓/ numpy,因此我懷疑大部分工作會釋放GIL,本地線程將會很有用。我擔心,讓他們通過gevent補丁將是完全次優的。然而,不修補本地線程給我帶來了其他麻煩(特別是當本地調度程序嘗試分叉Bokeh服務器時拋出錯誤,這是一個已知的限制)。在使用gevent和dask/distributed時是否有建議的最佳做法,還是應該避免?DASK的區域調度和GEVENT

回答

1

Dask.distributed採用旋風式併發,而在計算其他線程發生。計算和通信在相同的過程中重疊。如果您停止使用正確的線程,則通信將阻塞,直到長時間運行的計算完成。這可能會導致您的工作人員變得無法響應,因爲他們必須等待長時間運行的計算,然後才能處理與其他工作人員的通信請求。 numpy/pandas計算釋放GIL的事實只有在你真的使用線程時纔有用。

如果分叉關閉的背景虛化服務器是您還可以選擇只不與--no-bokeh標誌使用背景虛化的網絡服務器的問題。

dask-scheduler --no-bokeh 

或者,總之,dask.distributed不與GEVENT測試,並沒有計劃來支持它。

+0

權,這就是爲什麼我想用並行線程,而不是greenlets是。鑑於CPU綁定進程的阻塞性質,以及子進程會繼承greenlet的副本,我決定拋棄整個方法。我想不出一種明智的方式來同時使用dask和gevent。 –