Rocketry项目中级教程:深入任务调度与条件控制

Rocketry项目中级教程:深入任务调度与条件控制

rocketry Modern scheduling library for Python rocketry 项目地址: https://gitcode.com/gh_mirrors/ro/rocketry

前言

Rocketry是一个功能强大的Python任务调度库,在前面的基础教程中我们已经了解了它的基本用法。本文将深入探讨Rocketry的中级功能,帮助开发者构建更复杂、更健壮的任务调度系统。

异步运行模式

默认情况下,app.run会启动一个新的事件循环。但在实际项目中,我们经常需要将Rocketry与其他异步框架(如FastAPI)集成。这时可以使用app.serve方法,这是一个异步方法,可以更好地与其他异步应用协同工作。

import asyncio
from rocketry import Rocketry

app = Rocketry()

@app.task('daily')
async def do_async():
    await asyncio.sleep(5)

async def main():
    await app.serve()

if __name__ == "__main__":
    asyncio.run(main())

这种模式特别适合微服务架构,可以避免事件循环冲突问题。

会话配置调优

Rocketry提供了灵活的会话配置选项,可以根据项目需求进行调整:

  • 错误处理:生产环境中可能需要静默更多错误
  • 执行类型:可以更改默认的执行方式
  • 日志级别:根据环境调整日志详细程度

建议在项目初期就规划好这些配置,避免后期大规模调整。

条件API进阶用法

基础教程中我们主要使用字符串语法定义任务调度条件,但随着项目复杂度增加,字符串语法会带来一些问题:

  1. 代码分析工具无法识别字符串中的拼写错误
  2. 条件复用困难
  3. 维护成本高

Rocketry提供了更优雅的条件API:

from rocketry.conds import daily, weekly, time_of_day

@app.task(daily & time_of_day.between("08:00", "12:00"))
def morning_task():
    ...

@app.task(weekly.on("Monday") | weekly.on("Friday"))
def start_or_end_week_task():
    ...

这种API方式不仅更易读,还能享受IDE的代码提示和类型检查。

条件逻辑运算

Rocketry支持三种逻辑运算符,可以构建复杂的调度逻辑:

  • &:AND运算(与)
  • |:OR运算(或)
  • ~:NOT运算(非)

示例:

from rocketry.conds import true, false

@app.task((true & false) | (false & ~true))
def logic_task():
    ...

注意括号的使用可以改变运算优先级,这与常规的布尔逻辑一致。

任务管道化

在实际业务中,任务之间往往存在依赖关系。Rocketry提供了两种管道化方式:

1. 任务顺序执行

确保一个任务在另一个任务完成后执行:

from rocketry.conds import after_success

@app.task()
def first_task():
    ...

@app.task(after_success(first_task))
def second_task():
    ...

2. 数据管道

将前一个任务的输出作为后一个任务的输入:

from rocketry.args import Return, Arg

@app.task()
def producer():
    return "Hello World"

@app.task(after_success(producer))
def consumer(message=Arg(producer)):
    print(message)  # 输出 "Hello World"

这两种方式可以组合使用,构建完整的工作流。

参数化任务

Rocketry的参数系统非常强大,支持多种参数类型:

会话级参数

from rocketry.args import Arg

app.params(my_arg='默认值')

@app.task()
def task_with_param(item=Arg('my_arg')):
    ...

任务级参数

from rocketry.args import SimpleArg

@app.task()
def task_with_simple_param(item=SimpleArg('固定值')):
    ...

函数参数

from rocketry.args import FuncArg

def fetch_data():
    return "动态数据"

@app.task()
def task_with_func_param(data=FuncArg(fetch_data)):
    ...

元参数

可以访问调度系统内部组件:

from rocketry.args import Session, Task

@app.task()
def system_task(session=Session(), current_task=Task()):
    ...

自定义条件

当内置条件不满足需求时,可以创建自定义条件:

from rocketry.conds import daily

@app.cond()
def file_ready(file):
    import os
    return os.path.exists(file)

@app.task(daily & file_ready("data.csv"))
def process_data():
    ...

自定义条件可以接受参数,也可以使用Rocketry的参数系统。

任务日志管理

Rocketry使用Red Bird库实现灵活的日志系统:

持久化日志

from rocketry import Rocketry
from rocketry.log import MinimalRecord
from redbird.repos import CSVFileRepo

repo = CSVFileRepo(filename="task_logs.csv", model=MinimalRecord)
app = Rocketry(logger_repo=repo)

添加日志处理器

import logging
from rocketry import Rocketry

app = Rocketry()

handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)

task_logger = logging.getLogger('rocketry.task')
task_logger.addHandler(handler)

任务命名规范

每个任务必须有唯一名称,最佳实践包括:

  1. 显式命名重要任务
  2. 避免依赖自动生成的函数名
  3. 保持名称简洁且有意义
@app.task(name="重要数据处理任务")
def data_processing():
    ...

结语

通过本文介绍的中级功能,开发者可以构建更复杂、更可靠的任务调度系统。Rocketry的灵活设计能够满足从简单定时任务到复杂工作流调度的各种需求。建议在实际项目中逐步应用这些功能,根据具体场景选择最合适的模式。

rocketry Modern scheduling library for Python rocketry 项目地址: https://gitcode.com/gh_mirrors/ro/rocketry

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强懿方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值