Fastapi中的celery定时任务

一、安装celery和redis

1.安装celery和redis
  pip install celery redis

二、连接redis

  1. windows下载redis
    下载地址:https://github.com/MicrosoftArchive/redis/releases
    image

  2. celery

    celery = Celery('tasks', backend='redis://localhost:6379/1',broker='redis://localhost:6379/0')
    
  3. 代码

    # 在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中会看到

image
image
图二键值

'''
这段代码是 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 中可以提供任务调度、分布式处理、任务状态跟踪以及异步任务通信等功能,从而使得任务的管理和执行更加灵活高效。
"""
posted on 2023-08-31 14:15  zhangbinn  阅读(207)  评论(0编辑  收藏  举报