在Luigi中,我了解到要确定某个依赖项是否已成功完成,工作人员会检查该依赖项应生成的文件是否存在。
但是,如果任务在创建文件之后但在完成该任务之前引发异常,该怎么办?在那种情况下,任务没有完成应有的工作,但是在下一次运行时,磁盘上将存在一个文件,该文件将向工作人员指示任务已完成。
问题:如何更改此行为?如果我有一个长时间运行的任务,但失败,但异常,我想删除它开始创建的文件。我是否只将整个run()
包装在try/except
中?还是在Luigi中有更优雅的方法来做到这一点?
更新:
因此,在得到SO答复之前,我将以丑陋的方式进行操作,但实际上,我的丑陋的“解决方案”实际上不起作用。如果我尝试:
def run(self):
try:
my_stuff(self.my_arguments)
except Exception as e:
os.remove(self.output().path)
raise e
我明白了:
During handling of the above exception, another exception occurred:
( ... )
OSError: [Errno 26] Text file busy: '/path/my_big_file.db'
INFO: Informed scheduler that task _MyTask_a50a5eb8eb has status FAILED
更新:
令人惊讶的是,这不起作用:
try:
with sqlite3.connection(self.output().path) as connection:
my_long_task(connection, other_params)
except KeyboardInterrupt as e:
os.remove(self.output().path)
raise e
我遇到了同样的问题(文件忙)。