我正在使用Luigi推出一些管道。 我们来看一个简单的例子
task = myTask()
w = Worker(scheduler=CentralPlannerScheduler(), worker_processes=1)
w.add(task)
w.run()
现在让我们说myTask
在执行期间引发异常。我能够拥有的只是来自luigi的日志,显示异常。
luigi有什么方法可以传播它或者至少返回failure
状态?
然后我就可以让我的程序在该状态下起作用。
感谢。
修改 当我存储结果时,我忘了指定luigi的输出是针对数据库的。如果引发异常,则不会存储任何结果,但异常不会传播到luigi。我想知道路易吉是否可以选择这个。
答案 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