Luigiの流儀に沿わず、コードを書いてしまい、何度も書き直したため、アンチパターンをこちらにまとめておきます。
Luigiを扱う上での注意点については、下記の記事にまとめてあります。
Luigiを扱う上での注意点
並列タスク後の直列によるタスクへの依存
本来作りたいもの
並列で処理回して、最後に必ずやりたい後続処理(TaskC)を実施して終了
出来あがるもの
TaskBが一個でも失敗したらTaskCが動かない処理
from Luigi import Task, LocalTarget
from luigi.format import UTF8
class MyTask(Task):
def output(self):
return LocalTarget("MyTaskOut.txt", format=UTF8)
def run(self):
with self.input() as fin:
yield [TaskB(data) for data in fin]
yield TaskC() # 絶対やらなきゃいけない処理
with self.output().open('w') as fout:
fout.write('終わったよー')
出力ターゲットを指定しているが、ファイルを作らない処理
本来作りたいもの
成功した際に結果をファイルの出力して終了するタスク
出来上がるもの
永遠に終わらないタスク
from Luigi import Task, LocalTarget
from luigi.format import UTF8
class MyTask(Task):
def output(self):
return LocalTarget("MyTaskOut.txt", format=UTF8)
def run(self):
if なんかやばい処理:
with self.output().open('w') as fout:
fout.write('成功した!やったね!')
# 失敗した時はほっておこう
タスクを失敗させるため何か例外を起こさないとだめ。