📌 项目地址PrefectHQ/prefect | ⭐ 23,077 颗星 | 🔧 Python | 📜 未标注

传统脚本的脆弱性

把 Python 脚本跑在 cron 上,看起来解决了定时问题,但遇到网络抖动、API 限流、数据源临时不可用,脚本就挂了。更痛苦的是,你没法知道它什么时候失败,失败后有没有重试,依赖的其他任务有没有跑完。Prefect 正是为了解决这些“生产环境的真实问题”而来:它用 Python 原生的装饰器将函数包装成可观测、可重试、可调度的工作流组件。

三行代码上手:从脚本到工作流

安装 Prefect 需要 Python 3.10+(README 明确要求):

pip install -U prefect

然后创建一个最简单的 workflow。下面这段代码来自 README 示例,它用 @task 定义一个获取 GitHub star 数的任务,用 @flow 定义包含多个任务的工作流:

from prefect import flow, task
import httpx

@task(log_prints=True)
def get_stars(repo: str):
    url = f"https://api.github.com/repos/{repo}"
    count = httpx.get(url).json()["stargazers_count"]
    print(f"{repo} has {count} stars!")

@flow(name="GitHub Stars")
def github_stars(repos: list[str]):
    for repo in repos:
        get_stars(repo)

# run the flow!
if __name__ == "__main__":
    github_stars(["PrefectHQ/prefect"])

运行后,你已经在本地执行了第一个 Prefect 工作流。但这跟普通脚本没什么区别——真正的好处需要启动 Prefect 的服务器和 UI 来看到:

prefect server start

浏览器访问 http://localhost:4200,就能看到每次 flow 运行的记录、日志、任务状态。你不需要任何额外配置,Prefect 自动追踪所有执行信息。

从手动运行到自动化调度

想让工作流按计划自动执行?只需要把最后一行改成:

if __name__ == "__main__":
    github_stars.serve(
        name="first-deployment",
        cron="* * * * *",
        parameters={"repos": ["PrefectHQ/prefect"]}
    )

github_stars.serve() 会在本地启动一个进程,按 cron 表达式每分钟拉一次 star 数。serve 是 README 中给出的部署方法——它同时支持设置参数,让同一个 flow 在不同调度中传入不同参数。

之后,你可以从 UI 手动触发任意一次运行,也可以在 CLI 中用 prefect deployment run 触发,甚至暂停、取消某个调度。所有操作都通过该 UI 或 CLI 完成。

核心能力:不只是加了个调度器

Prefect 的真正价值藏在 @task@flow 的参数里。默认情况下,任务失败会自动重试(你可以设置 retriesretry_delay_seconds);支持缓存(cache_key_fncache_expiration),避免重复计算;还可以通过 on_failureon_completion 等钩子接自定义逻辑。

更重要的是,Prefect 允许你在 flow 中动态构建任务图(DAG 不必预先定义死)。例如在 for 循环中根据运行时数据决定创建多少个任务,这是 Airflow 等传统 DAG 框架很难做到的。Prefect 的 flow 就是普通的 Python 函数,支持条件、循环、异常处理,配合 prefect.context 可以拿到运行时的各种上下文信息。

与 Airflow 等工具的关键区别

对比项 Prefect Airflow
DAG 定义方式 Python 装饰器,运行时动态创建 Python 脚本 + DAG 文件,静态解析
本地调试 直接 python script.py 即可运行,不需要启动集群 需要启动调试环境或本地 Airflow
部署复杂度 serve() 一行代码即可启动调度 需要配置 scheduler、worker、数据库等
事件驱动 原生支持基于外部事件的自动触发 需要额外插件或 webhook

Prefect 的设计哲学是“开发者体验优先”——你不需要学习一套新的 DSL(领域特定语言),只要会用 Python 装饰器就能上手。而 Airflow 适合超大规模、历史包袱重的团队,且愿意接受更陡峭的学习曲线。

需要注意的几点

  • 版本要求:Prefect 需要 Python 3.10 及以上(README 明确),许多生产环境可能还停留在 3.8/3.9,升级前需确认。
  • 运行模式prefect server start 启动的是本地单机版,适合开发测试。生产环境推荐使用 Prefect Cloud 或自己挂载持久化数据库的 server。官方区分了开源自托管版本和托管云服务,前者免费,后者有付费层级。
  • 任务幂等性:Prefect 的自动重试依赖任务本身的幂等性。如果重试会导致重复写入或副作用,需要自行处理(例如在业务代码中做幂等检查)。
  • 社区与文档:Prefect 的文档非常详尽(README 中提供了大量 docs.prefect.io 链接),但部分高级功能(如事件自动化)需要阅读文档才能用好。

总结

Prefect 把“让 Python 脚本生产化”这件事的成本降到了最低:装一个包、加两个装饰器、运行一条 CLI 命令,就能获得调度、重试、缓存、可视化、事件驱动等全套能力。如果你正在用 cron 或简单的 while 循环管理数据流水线,并且希望无痛升级到可观测、可复原的生产级工作流,Prefect 是目前最直接的答案。

这篇文章对你有帮助吗?

发表回复