Django-Celery

Celery 是⼀个基于python开发的异步任务队列/基于分布式消息传递的作业队列,通过它可以轻松的实现任务的异步处理。它侧重于实时操作,但对调度⽀持也很好。Celery⽤于⽣产系统每天处理数以百万计的任务。Celery是⽤Python编写的,但该协议可以在任何语⾔实现。它也可以与其他语⾔通过webhooks实现。Celery 建议的消息队列是RabbitMQ,但提供⽀持Redis, Beanstalk, MongoDB, CouchDB, 和数据库(使⽤SQLAlchemy的或Django的 ORM)。Celery是易于集成Django, Pylons 和 Flask,使⽤ django-celery, celery-pylons 和 Flask-Celery 附加包即可。

Celery的优势

⽅便查看定时任务的执⾏情况, 如是否成功, 当前状态, 执⾏任务花费的时间等.

使⽤功能⻬备的管理后台或命令⾏添加,更新,删除任务.

⽅便把任务和配置管理相关联.

可选多进程, Eventlet 和 Gevent 三种模型并发执⾏.

提供错误处理机制.

提供多种任务原语, ⽅便实现任务分组,拆分,和调⽤链.

⽀持多种消息代理和存储后端.

Celery 是语⾔⽆关的,它提供了python 等常⻅语⾔的接⼝⽀持

官方文档:Celery 初步 — Celery 3.1.7 文档 (jinkan.org)

一、相关概念

架构图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pm9AIX4A-1644655802644)(.\bed316c5eeffaea1e09eff340be15361_720w.png)]

task 就是任务,包括异步任务和定时任务

broker 中间⼈,接收⽣产者发来的消息即Task,将任务存⼊队列。

Worker是任务的消费者。Celery本身不提供队列服务,推荐⽤Redis或RabbitMQ实现队列服务。

worker 执⾏任务的单元,它实时监控消息队列,如果有任务就获取任务并执⾏它。

backend ⽤于存储任务的执⾏结果。Celery⽀持以不同⽅式存储任务的结果, 包括AMQP, redis,memcached, mongodb,SQLAlchemy, Django ORM, Apache Cassandra, IronCache 等。

beat 定时任务调度器,根据配置定时将任务发送给Broler

二、应用场景

异步调用:⽤户不关⼼那些费时间但是⼜存在在我们API⾥⾯的操作我们就可以⽤异步调⽤的⽅式来优化(发送邮件或者上传头像,需要时间但是用户并不关心这件事)

定时任务:定期去统计⽇志,数据备份,或者其他的统计任务

三、安装配置

3.1、安装
pip install celery
pip install celery-with-redis
#django-celery-results库基于 Django ORM实现了结果存储后端
pip install django-celery-results
3.2、配置
INSTALLED_APPS = [
    'celery',
    'django_celery_results',
]
BROKER_URL='redis://localhost:6379/5'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json' # 任务序列列化和反序列列化使⽤用json
CELERY_RESULT_SERIALIZER = 'json' # 结果序列列化为json
3.3、创建Celery实例

[项目名]/celery.pysettings.py的同目录

from __future__ import absolute_import  # 绝对路径导⼊入
from celery import Celery
from django.conf import settings
import os

# 设置系统的环境配置⽤用的是Django的
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled.settings")
# 实例例化celery
app = Celery('mycelery')
app.conf.timezone = "Asia/Shanghai"
# 指定celery的配置来源 ⽤用的是项⽬目的配置⽂文件settings.py
app.config_from_object("django.conf:settings")
# 让celery ⾃动去发现我们的任务(task)
app.autodiscover_tasks()
# 你需要在app⽬录下 新建⼀个叫tasks.py(⼀定不不要写错)文件

[项目名]/init.pysettings.py的同目录下加下面这段语句

from __future__ import absolute_import
from .celery import app as celery_app

四、celery的使用

4.1、创建任务

app/tasks.py

from celery import shared_task
import time
@shared_task
def hello_celery(loop):
	for i in range(loop):
		print('hello')
		time.sleep(2)

app/views.py

def formTest(request):
    # 我们的任务调用
    # 调用方式 任务函数名.delay(参数,,,,)
    hello_celery.delay(10)
    return HttpResponse('OK')

生成数据表

python manage.py migrate django_celery_results

我们先启动我们的项目,在执行下面的指令启动celery

celery -A 你的⼯程名 worker -l info

很不幸,报错了

Task handler raised error: ValueError('not enough values to unpack (expected

查找过后我们发现是windows和celery版本的问题,我们需要再下载一个包

pip install eventlet

启动worker的时候也需要再添加一个参数

celery -A 你的⼯程名 worker --loglevel=info -P eventlet

此时我们重启celery(修改tasks.py的内容后 要重启celery的服务),重启项目,发现可以实现我们的功能了,输出日志如下

[2022-02-12 15:52:20,995: WARNING/MainProcess] hello
[2022-02-12 15:52:22,995: WARNING/MainProcess] hello
[2022-02-12 15:52:25,001: WARNING/MainProcess] hello
[2022-02-12 15:52:27,017: WARNING/MainProcess] hello
[2022-02-12 15:52:29,021: WARNING/MainProcess] hello
[2022-02-12 15:52:31,035: WARNING/MainProcess] hello
[2022-02-12 15:52:33,041: WARNING/MainProcess] hello
[2022-02-12 15:52:35,036: WARNING/MainProcess] hello
[2022-02-12 15:52:37,049: WARNING/MainProcess] hello
[2022-02-12 15:52:39,059: WARNING/MainProcess] hello
4.2、获取执行任务的结果

异步任务执⾏行行完毕后,会⾃自动触发信号:

before_task_publish
after_task_publish
task_prerun
task_postrun
task_success
task_failure
task_revoked
from celery.signals import task_success
@task_success.connect(sender=add)
def task_done_handler(sender=None, result=None):
	print(result)
4.3、定时任务

启动

celery -A 你的⼯工程名称 beat -l info

settings.py

CELERYBEAT_SCHEDULE = {
	'schedule-test': {
		'task': 'app.tasks.hello_celery',
        'schedule': timedelta(seconds=3),
        'args': (2,)
        },
}

我们启动定时任务服务时 也要先开启worker

如果只开启定时服务没有开启worker服务 那么定时任务会被放入任务队列,但是由于没有干活⼉儿的worker 那么任务是不会被执行,当worker服务被启动后 会立刻去任务队列领任务并执行

你的任务一定要确保是可以正常执⾏行行的

settings.py也可以这样写

from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
    "every-ten-second-run-my_task": {
        "task": "t07.tasks.my_task",
        "schedule": crontab(minute="01", hour="15"),
        "args": (2,)
    }
}
4.4、其他异步任务

Celery提供了了⼀个⼯具flower,将各个任务的执行情况、各个worker的健康状态进行监控并以可视化的方式展现

安装flower

pip install flower

启动flower

celery flower --broker=redis://localhost:6379/5

查看flower

http://localhost:5555

五、配置

# celery配置
# 设置Broker和backend
BROKER_URL = 'redis://127.0.0.1:6379/1'
# 将数据存放到redis1数据库,redis默认有16个数据库
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
# 将数据存储到django的数据库
# CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'  # 任务序列列化和反序列列化使⽤用json
CELERY_RESULT_SERIALIZER = 'json'  # 结果序列列化为json
CELERYD_MAX_TASKS_PER_CHILD = 1000  # 每个worker执行了多少任务就会死掉
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 后端存储任务超过一天则自动清理
CELERYBEAT_SCHEDULE = {
    'schedule-test': {
        'task': 'app.tasks.hello_celery',
        'schedule': timedelta(seconds=10),
        'args': (2,)
    },
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Django-Celery是一个用于在Django应用中集成Celery任务队列的插件。它允许你将耗时的任务异步执行,从而提高应用的性能和响应速度。下面是一些使用Django-Celery的步骤: 1. 安装Celery和Django-Celery:首先,确保你已经安装了Celery和Django-Celery。你可以通过运行以下命令来安装它们: ``` pip install celery django-celery ``` 2. 配置Celery:在Django项目的`settings.py`文件中,添加以下配置: ```python # settings.py # 配置Celery Broker(消息代理) BROKER_URL = 'amqp://guest:guest@localhost:5672//' # 配置Celery Backend(结果存储) CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite' # 配置Celery Beat(定时任务) CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler' ``` 请根据你的实际情况修改上述配置。 3. 创建Celery App:在你的Django项目中,创建一个名为`celery.py`的文件,并添加以下代码: ```python # celery.py from celery import Celery app = Celery('your_project_name') # 配置Celery app.config_from_object('django.conf:settings', namespace='CELERY') # 自动从Django app中加载任务 app.autodiscover_tasks() ``` 确保将`your_project_name`替换为你的项目名称。 4. 创建任务:在Django app中创建一个任务。例如,你可以在你的app目录下创建一个名为`tasks.py`的文件,并添加以下代码: ```python # tasks.py from celery import shared_task @shared_task def add(x, y): return x + y ``` 这是一个简单的任务示例,将两个数字相加并返回结果。 5. 启动Celery Worker:运行以下命令来启动Celery worker: ``` celery -A your_project_name worker --loglevel=info ``` 确保将`your_project_name`替换为你的项目名称。 6. 调用任务:在你的Django应用程序中,你可以通过导入任务函数并调用它来触发任务的执行。例如: ```python from your_app.tasks import add result = add.delay(1, 2) ``` 这里使用了`delay()`方法来异步调用任务。你也可以使用`apply_async()`方法来更精确地控制任务的执行。 这些是使用Django-Celery的基本步骤。你还可以配置更多高级选项,如任务重试、任务结果存储等。请参考Django-Celery的官方文档以获取更多详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LyaJpunov

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

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

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

打赏作者

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

抵扣说明:

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

余额充值