2017-08-17 55 views
1

在dask.distributed上使用期貨時,有沒有辦法區分目前正在評估的期貨pending和仍然在隊列中?如何區分排隊和正在運行的期貨(並殺死運行時間過長的期貨)

原因是我將大量任務(〜8000)提交給較小的工作人員(100),因此不是所有任務都可以立即處理。這些任務涉及調用第三方可執行文件(,通過subprocess.check_output),在一些極少數情況下會進入無限循環。

因此,我想取消期貨運行時間太長(使用任意超時)。然而,似乎沒有辦法確定未來是否長期處於pending狀態,因爲計算時間比平時長,或者僅僅因爲必須等待工作人員可用。

我的設置涉及一個分別運行dask-schedulerdask-worker作業/作業數組的SGE羣集。 我試圖在提交Python函數直接設置超時,使用@timeout_decorator.timeout(60, use_signals=False)timeout_decorator package,但得到了以下錯誤:

"daemonic processes are not allowed to have children" 

任何幫助將非常感激。

回答

0

不,您無法確定任務是否已開始執行。通常我們建議將這個邏輯放在任務本身中,正如你試圖用你的超時修飾器一樣。

我推薦使用timeout=關鍵字本身。我懷疑這會更簡單,並有更高的工作順利。

+0

感謝您的快速答覆。我正在運行Python 2,其中'subprocess'缺少'timeout ='關鍵字,但我可以在下面的答案中獲得與代碼相同的效果。儘管這是一個特定於實現的細節,所以我將這個答案標記爲正確的答案。 – user3098840

0

對於運行Python 2的用戶,timeout=關鍵字在subprocess.check_output中不可用。

我能夠通過使用subprocess.Popen代替,以獲得預期的效果,這立即返回:

import subprocess 
import shlex # useful to split up arguments for subprocess 
import time 

p = subprocess.Popen(shlex.split('/path/to/binary arg1 arg2'), 
        stderr=subprocess.STDOUT) 
for _ in range(60): # wait for up to 60 seconds 
    if p.poll() is not None: 
     break # process completed 
    else: 
     time.sleep(1.0) # give it more time 
if p.poll() is None: # time is up, are we done? 
    try: 
     p.kill() 
    except: 
     raise 
    raise RuntimeError('Binary failed to complete in time.') 
相關問題