Fastapi中的celery定时任务
一、安装celery和redis
1.安装celery和redis
pip install celery redis
二、连接redis
-
windows下载redis
下载地址:https://github.com/MicrosoftArchive/redis/releases
-
celery
celery = Celery('tasks', backend='redis://localhost:6379/1',broker='redis://localhost:6379/0')
-
代码
# 在main.py中 from tasks import add_task from celery.schedules import crontab from celery import Celery from fastapi import FastAPI app = FastAPI() celery = Celery('tasks', backend='redis://172.16.35.152:6379/1',broker='redis://172.16.35.152:6379/0') celery.conf.update( task_serializer='json', result_serializer='json', accept_content=['json'], timezone='Asia/Shanghai', ) celery.task(add_task) celery.conf.beat_schedule = { 'add-every-30-seconds': { 'task': 'tasks.add', 'schedule': 30.0, # 'args': (16, 16) }, 'add-every-minute': { 'task': 'tasks.add_task', 'schedule': crontab(minute='*'), # 'args': (32, 32) } } # celery.worker_main(['celery','worker','-l','INFO']) # celery.beat_main(['celery','beat','-l','INFO']) @app.get('/') async def root(): return {'message': 'Hello, world!'} ''' 这段代码主要是一个使用 Celery 和 FastAPI 框架的应用程序。 首先,导入了所需的模块和类,包括 add_task 函数、crontab 类、Celery 类以及 FastAPI 类。 然后,创建了一个 FastAPI 应用程序实例,并命名为 app。 接下来,创建了一个 Celery 实例,并命名为 celery。在创建实例时,指定了 Redis 作为消息代理(broker)和结果存储(backend)的位置,即 'redis://172.16.35.152:6379/0' 和 'redis://172.16.35.152:6379/1'。同时,通过 celery.conf.update() 方法更新了一些配置参数,包括任务序列化方式、结果序列化方式、接受的内容类型以及时区。 然后,通过 celery.task() 装饰器将 add_task 函数注册成为一个 Celery 任务。 接着,定义了一个 celery.conf.beat_schedule 的字典,其中包含了两个定时任务: 'add-every-30-seconds':表示每30秒执行一次 tasks.add 任务。 'add-every-minute':表示每分钟执行一次 tasks.add_task 任务。 最后,定义了一个根路由 / 的处理函数 root(),当通过 GET 请求访问根路径时,返回一个包含 {'message': 'Hello, world!'} 的字典作为响应。 需要注意的是,代码中有两行注释掉的代码 # celery.worker_main(['celery','worker','-l','INFO']) 和 # celery.beat_main(['celery','beat','-l','INFO']),这些代码用于启动 Celery 的 worker 和 beat 进程,可以根据需要取消注释来启动它们。 综上所述,这段代码实现了一个使用 Celery 和 FastAPI 的应用程序,其中定义了一些定时任务,并提供了一个根路由处理函数。 ''' # 在tasks.py中 from celery import shared_task count = 0 @shared_task def add_task(): count += 1 print(count) return count
启动命令
1.python main.py 2.celery -A main.py.celery beat
三、在redis中会看到
图二键值
'''
这段代码是 Redis 中存储的一个 JSON 格式的数据。它包含了一些关于任务的信息,例如任务的参数、任务的标识符、任务的执行状态等。
具体来说,它包含以下字段:
"body":任务的主体内容,经过 Base64 编码后的字符串。
"content-encoding":内容编码方式,这里是 UTF-8。
"content-type":内容类型,这里是应用程序/JSON。
"headers":请求头信息,其中包含了一些关于任务的属性和元数据,如语言、任务函数、任务ID、重试次数等。
"properties":消息的属性,包括关联ID、回复队列、传递模式、传递信息等。
'''
{
"body": "W1tdLCB7fSwgeyJjYWxsYmFja3MiOiBudWxsLCAiZXJyYmFja3MiOiBudWxsLCAiY2hhaW4iOiBudWxsLCAiY2hvcmQiOiBudWxsfV0=",
"content-encoding": "utf-8",
"content-type": "application/json",
"headers": {
"lang": "py",
"task": "tasks.add",
"id": "f60e5cb6-14a3-430e-a757-7aa2b96fd9be",
"shadow": null,
"eta": null,
"expires": null,
"group": null,
"group_index": null,
"retries": 0,
"timelimit": [
null,
null
],
"root_id": "f60e5cb6-14a3-430e-a757-7aa2b96fd9be",
"parent_id": null,
"argsrepr": "()",
"kwargsrepr": "{}",
"origin": "gen7839@TSJ-011874",
"ignore_result": false,
"stamped_headers": null,
"stamps": {
}
},
"properties": {
"correlation_id": "f60e5cb6-14a3-430e-a757-7aa2b96fd9be",
"reply_to": "429f749c-85c9-374f-bb6c-accab8a84f4c",
"delivery_mode": 2,
"delivery_info": {
"exchange": "",
"routing_key": "celery"
},
"priority": 0,
"body_encoding": "base64",
"delivery_tag": "ff762073-e753-4dda-8241-5d17e9e76f94"
}
}
"""
这段代码中的任务信息存储在 Redis 中,具有以下用途:
任务调度:通过将任务信息存储在 Redis 中,可以实现任务的定时调度和执行。Celery 可以从 Redis 中读取任务信息,并根据预定的时间间隔或时间规则执行相应的任务。
分布式任务处理:Redis 是一个分布式数据存储系统,多个 Celery Worker 可以同时连接到同一个 Redis 实例,从而实现任务的分布式处理。当有新的任务添加到 Redis 中时,Worker 可以从队列中获取任务并进行处理,实现高效的任务分发和并行处理。
任务状态跟踪:任务信息中的字段包含了任务的标识符、重试次数、执行状态等关键信息,这些信息可以帮助跟踪任务的执行过程和状态。通过查询 Redis 中的任务信息,可以了解任务的进展以及是否成功完成。
异步任务通信:通过消息队列机制,在分布式环境下实现异步任务之间的通信和协作。任务信息中的属性可以包含回复队列等信息,用于实现任务之间的异步通信和结果返回。
综上所述,将任务信息存储在 Redis 中可以提供任务调度、分布式处理、任务状态跟踪以及异步任务通信等功能,从而使得任务的管理和执行更加灵活高效。
"""