celery详解

发布时间 2023-04-23 20:06:33作者: 小王应该在学习!

celery详解

1.celery解释
celery 是一个基于Python的任务队列管理器,可以帮助我们异步处理耗时操作,从而提高应用的性能和可伸缩性。
它支持多种消息代理,比如说RabbitMQ、Redis、Amazon SQS等,并且可以与Django、Flask等web框架集成使用
2.celery 异步任务框架
"""
1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket)
2)celery服务为为其他项目服务提供异步解决任务需求的
注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求

人是一个独立运行的服务 | 医院也是一个独立运行的服务
	正常情况下,人可以完成所有健康情况的动作,不需要医院的参与;但当人生病时,就会被医院接收,解决人生病问题
	人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求
"""

3 celery架构
消息中间件(message broker)、任务执行单元(worker)和 任务执行结果存储(task result store)组成。

image-20230301162038433

消息中间件
celery本身是不提供服务的,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ、Redis。
任务执行单元
Worker是celery提供的任务执行单元,worker并发的运行在分布式的系统节点上
任务结果存储
Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等
celery 的应用场景
异步执行:解决耗时任务
延迟执行:解决延迟任务
定时任务:解决周期任务
异步怎么来理解
在Python中,异步通常指的是一种编程模型,称为异步编程或事件驱动编程。异步编程的目标是提高程序的效率和性能,特别是在处理大量IO操作时。

在传统的同步编程模型中,程序执行一个操作后,必须等待该操作完成后才能执行下一个操作。这样的模型在处理大量IO操作时效率低下,因为大部分时间都在等待IO操作完成。
# 异步编程模型通过使用非阻塞IO操作和事件回调机制,允许程序在等待IO操作完成的同时执行其他任务,从而提高了程序的效率和性能。

在Python中,异步编程主要通过asyncio模块来实现。
使用asyncio可以定义异步函数,即使用async def定义的函数,该函数可以使用await关键字等待其他异步函数完成。异步函数可以在事件循环中被调度执行,这样可以避免阻塞程序的执行。在异步编程中,通常使用协程来处理任务,使用async with语句来管理资源的生命周期,使用async for语句来遍历异步迭代器。

总之,异步编程是一种编程模型,可以提高程序的效率和性能,特别是在处理大量IO操作时。
在Python中,异步编程主要通过asyncio模块实现,使用异步函数、协程、事件循环和其他异步相关的语言特性来实现。

celery在案例的使用

1.安装celery
pip install celery

2.创建一个任务
# tasks.py
from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

# 定义了一个名为add的任务,用来将两个数字相加,并返回结果。@app.task装饰器将这个函数转换成一个可调用的任务对象

3.启动celery worker
celery -A tasks worker --loglevel=info

# 这里使用-A参数来指定Celery应用的模块名称,worker是指启动一个Celery工作进程来执行任务。

4.在应用中调用任务
# app.py
from tasks import add

result = add.delay(4, 4)
print(result.get())

# 这里调用了add任务,并传递两个参数4和4,使用delay方法来异步执行任务,并返回一个AsyncResult对象。可以使用get方法来获取任务的执行结果。
包架构封装

image

Django中使用celery
"""
celery框架django项目工作流程
1)加载django配置环境
2)创建Celery框架对象app,配置broker和backend,得到的app就是worker
3)给worker对应的app添加可处理的任务函数,用include配置给worker的app
4)完成提供的任务的定时配置app.conf.beat_schedule
5)启动celery服务,运行worker,执行任务
6)启动beat服务,运行beat,添加任务

重点:由于采用了django的反射机制,使用celery.py所在的celery_task包必须放置项目的根目录下
"""