2017-02-28 62 views
2

我一直在嘗試將Luigi作爲我們的工作流程處理程序。目前我們正在使用concourse,但是我們試圖做的很多事情都是在大廳中散步,所以我們轉而使用Luigi作爲依賴管理器。到目前爲止沒有問題,工作流程觸發並正確執行。Python中的事件處理Luigi

當任務因任何原因失敗時出現問題。這種情況特別是需要任務塊,但所有情況都需要照顧。截至目前,Luigi優雅地處理了錯誤並將其寫入STDOUT。它仍然會發出並退出代碼0,這意味着作業已通過。假陽性。

我一直試圖讓事件處理來解決這個問題,但我不能讓它觸發,即使有一個非常簡單的工作:

@luigi.Task.event_handler(luigi.Event.FAILURE) 
def mourn_failure(task, exception): 
    with open('/root/luigi', 'a') as f: 
     f.write("we got the exception!") #testing in concourse image 
    sys.exit(luigi.retcodes.retcode().unhandled_exception) 

class Test(luigi.Task): 
    def requires(self): 
     raise Exception() 
     return [] 

    def run(self): 
     pass 

    def output(self): 
     return [] 

然後在Python shell中運行命令

luigi.run(main_task_cls=Test, local_scheduler=True)

異常升起,但偶不發生或什麼。 該文件不被寫入和退出代碼仍爲0

而且,如果它使在其中包含

[retcode] 
already_running=10 
missing_data=20 
not_run=25 
task_failed=30 
scheduling_error=35 
unhandled_exception=40 

/etc/luigi/client.cfg的差異,我有我路易吉配置我不知道爲什麼事件處理程序不會觸發,但不知何故,我需要該過程在發生錯誤時失敗。

+0

嗯我不太確定如何使用luigi,但基本上,當測試失敗時,您將需要一個非零的退出代碼... 大廳事件流程非常簡單。 1.運行您的task.yml中指定的腳本 2.根據腳本的退出代碼轉爲綠色或紅色 –

回答

0

看起來問題在於你放置「引發異常」調用。 如果將它放在require函數中 - 它基本上會在測試任務運行方法之前運行。所以它不像你的測試任務失敗,而是它依賴的任務(現在,空白......)。

例如,如果您將加註運行,您的代碼將按照您的預期運行。

def run(self): 
     print('start') 
     raise Exception() 

到了那裏你所依賴的失敗處理的情況下(在這種情況下,引發異常的需要方法),您可以添加其他類型的路易吉事件處理程序,BROKEN_TASK的:luigi.Event.BROKEN_TASK。 這將確保luigi代碼發出您期望的返回碼(不同於0)。

乾杯!

0

如果我的理解正確,你只是想讓luigi在任務失敗時返回一個錯誤代碼,我對這個有很多問題,但事實證明這很簡單,你只需要用luigi就可以運行它命令行,而不是python。就像這樣:

luigi --module my_module MyTask

我不知道,如果這是你的問題太多,但我使用python運行,然後路易吉忽略對luigi.cfg的retcodes。希望能幫助到你。