我一直在尝试将 Luigi 集成为我们的工作流处理程序。目前我们正在使用 concourse,但是我们尝试做的许多事情在 concourse 中很麻烦,所以我们切换到 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。
另外,如果有什么不同,我在 /etc/luigi/client.cfg 有我的 luigi 配置,其中包含
[retcode]
already_running=10
missing_data=20
not_run=25
task_failed=30
scheduling_error=35
unhandled_exception=40
我不知道为什么事件处理程序不会触发,但不知何故我需要该过程因错误而失败。