You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Luigi中触发任务未重跑(无缺失依赖/已运行)的事件?

嘿,看起来你已经把Luigi的基础事件处理玩得很溜了!要搞定「任务已完成无需重跑时触发事件」这个需求其实不难,咱们结合你的周日无新文件场景,一步步来拆解:

处理Luigi任务已完成(无需重跑)的事件触发

核心思路是利用Luigi的事件系统——不管是内置的跳过事件,还是自定义事件,都能精准捕捉到任务“已经完成、不用再跑”的状态。

方法1:用内置Event.SKIP事件直接监听

当Luigi判定任务已经完成(也就是你的complete()方法返回True),会直接跳过任务执行,这时候会触发Event.SKIP事件。你可以像监听SUCCESS事件那样,给这个事件绑定回调逻辑。

比如你的每日任务是DailyDataTask,咱们可以这么写:

import luigi
from luigi.event import Event

def send_skip_notification(task):
    # 这里替换成你现有的邮件发送逻辑就行,比如复用成功邮件的代码
    print(f"任务 {task.task_id} 已完成无需重跑,发送通知邮件")
    # 举个例子:send_email(subject=f"任务完成通知:{task.date}", content="任务已完成,无需重跑")

# 给DailyDataTask绑定SKIP事件的回调
luigi.Event.SKIP.add_handler(DailyDataTask, send_skip_notification)

class DailyDataTask(luigi.Task):
    date = luigi.DateParameter()

    def requires(self):
        # 你的依赖任务,比如检查当日文件是否存在
        return CheckDailyFileExists(self.date)

    def run(self):
        # 你的任务执行逻辑,比如处理数据
        pass

    def complete(self):
        # 判定任务是否完成的逻辑:检查目标文件是否存在
        return luigi.LocalTarget(f"/data/{self.date}.csv").exists()

这样一来,只要DailyDataTask因为已完成被跳过,send_skip_notification就会自动触发,完美覆盖你周日无文件时的场景。

方法2:自定义事件,精准控制触发时机

如果SKIP事件的范围太宽(比如你想区分“任务从未运行但依赖不满足”和“任务已完成无需重跑”),那可以自定义一个事件,在complete()方法里手动触发:

import luigi
from luigi.event import Event

# 定义一个专属的自定义事件
TASK_ALREADY_FINISHED = Event("task-already-finished")

def send_custom_complete_notification(task):
    # 这里可以加更细的判断,比如周日专属逻辑
    if task.date.weekday() == 6:  # 周日对应weekday=6
        print(f"周日无新文件,任务 {task.task_id} 已完成,发送周日专属通知")
    else:
        print(f"任务 {task.task_id} 已完成无需重跑,发送常规通知")
    # 邮件发送逻辑...

# 给任务绑定自定义事件
TASK_ALREADY_FINISHED.add_handler(DailyDataTask, send_custom_complete_notification)

class DailyDataTask(luigi.Task):
    date = luigi.DateParameter()

    def complete(self):
        target = luigi.LocalTarget(f"/data/{self.date}.csv")
        if target.exists():
            # 手动触发自定义事件
            TASK_ALREADY_FINISHED(self)
            return True
        return False

    # requires和run方法保持你的原有逻辑不变

这种方式更灵活,你可以在complete()里加各种条件判断,比如只在周日触发特殊通知,完全贴合你的业务场景。

几个小提醒

  • 如果你已经有SUCCESS事件的邮件代码,直接复用就行,不用重复造轮子;
  • 回调函数里的task参数可以拿到任务的所有属性(比如date、task_id),方便你做个性化通知;
  • 确保你的回调逻辑是线程安全的,毕竟Luigi可能在多线程环境下运行。

内容的提问来源于stack exchange,提问作者femibyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:16:18