Rocketry项目中级教程:深入任务调度与条件控制
rocketry Modern scheduling library for Python 项目地址: 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进阶用法
基础教程中我们主要使用字符串语法定义任务调度条件,但随着项目复杂度增加,字符串语法会带来一些问题:
- 代码分析工具无法识别字符串中的拼写错误
- 条件复用困难
- 维护成本高
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)
任务命名规范
每个任务必须有唯一名称,最佳实践包括:
- 显式命名重要任务
- 避免依赖自动生成的函数名
- 保持名称简洁且有意义
@app.task(name="重要数据处理任务")
def data_processing():
...
结语
通过本文介绍的中级功能,开发者可以构建更复杂、更可靠的任务调度系统。Rocketry的灵活设计能够满足从简单定时任务到复杂工作流调度的各种需求。建议在实际项目中逐步应用这些功能,根据具体场景选择最合适的模式。
rocketry Modern scheduling library for Python 项目地址: https://gitcode.com/gh_mirrors/ro/rocketry
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考