Luigi可以传播例外或返回任何结果吗?

时间:2015-09-15 15:47:28

标签: python luigi

我正在使用Luigi推出一些管道。 我们来看一个简单的例子

task = myTask()
w = Worker(scheduler=CentralPlannerScheduler(), worker_processes=1)
w.add(task)
w.run()

现在让我们说myTask在执行期间引发异常。我能够拥有的只是来自luigi的日志,显示异常。

luigi有什么方法可以传播它或者至少返回failure状态?

然后我就可以让我的程序在该状态下起作用。

感谢。

修改 当我存储结果时,我忘了指定luigi的输出是针对数据库的。如果引发异常,则不会存储任何结果,但异常不会传播到luigi。我想知道路易吉是否可以选择这个。

2 个答案:

答案 0 :(得分:14)

来自docs

  

Luigi有一个内置的事件系统,允许您注册回调事件并从您自己的任务中触发它们。您既可以挂钩一些预先定义的事件,也可以创建自己的事件。每个事件句柄都绑定到一个Task类,并且只能从该类或其子类触发。这使您可以毫不费力地仅从特定类中订阅事件(例如,对于hadoop作业)。

示例:

import luigi

from my_tasks import MyTask


@MyTask.event_handler(luigi.Event.FAILURE)
def mourn_failure(task, exception):
    """Will be called directly after a failed execution
    of `run` on any MyTask subclass
    """

    do_something()


luigi.run()

路易吉有一个lot of events you can choose from。您还可以查看this tests以了解如何倾听并对其他事件做出反应。

答案 1 :(得分:-1)

您可以做的是将错误写入文件。例如,在您的任务可能失败(让我们称之为TaskA):

x=""
try:
    do stuff
except:
    x="error!"
with open('errorfile.log','w') as f:
    f.write(x)

然后,在依赖于该错误的任务中,该任务将需要TaskA。你可以这样做:

with open('errorfile.log','r') as f:
    if f.read()://if anything is in the error log from TaskA
        //error occurred
        do stuff
    else:
        do other stuff