celery 集成到 Django 项目中,实现异步任务处理和定时任务处理

Django 集成 Celery 到项目

本节将 celery 集成到 Django 项目中,实现异步任务处理和定时任务处理
Celery 工作流程
c

Celery 的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。

消息中间件

Celery 本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis, MongoDB (experimental), Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ

任务执行单元

Worker 是 Celery 提供的任务执行的单元,worker 并发的运行在分布式的系统节点中。

任务结果存储

Task result store 用来存储 Worker 执行的任务的结果,Celery 支持以不同方式存储任务的结果,包括 AMQP, Redis,memcached, MongoDB,SQLAlchemy, Django ORM,Apache Cassandra, IronCache
在虚拟环境中安装:

在这里插入图片描述
查看集成到 Django 中的 celery 版本, pip freeze

celery3.1.26.post2 django-celery3.2.2 flower==0.9.2

启动 redis 服务, 端口假设为 6379

发现 pip 安装比较慢的情况

pip install pillow -i https://pypi.douban.com/simple
2、Django 中配置

(1)在主工程的配置文件settings.py 中应用注册表INSTALLED_APPS中加入 djcelery
在这里插入图片描述
(2) 在 settings.py 中加入 celery 配置信息
在这里插入图片描述
当 djcelery.setup_loader() 运行时,Celery 便会去查看 INSTALLD_APPS 下包含的所有 app目录中的 tasks.py 文件,找到标记为 task 的方法,将它们注册为 celery task

BROKER_URL:broker 是代理人,它负责分发任务给 worker 去执行。我使用的是 Redis 作为 broker

没有设置 CELERY_RESULT_BACKEND,默认没有配置,此时 Django 会使用默认的数据库(也是你指定的 orm 数据库)。

CELERY_IMPORTS:是导入目标任务文件

CELERYBEAT_SCHEDULER:使用了 django-celery 默认的数据库调度模型,任务执行周期都被存在默认指定的 orm 数据库中.

CELERYBEAT_SCHEDULE:设置定时的时间配置, 可以精确到秒,分钟,小时,天,周等。

(3)创建应用实例

在主工程目录添加 celery.py, 添加自动检索 django 工程tasks任务

vim artproject/celery.py
在这里插入图片描述
(4) 创建任务 tasks

每个任务本质上就是一个函数,在 tasks.py 中,写入你想要执行的函数即可。

在应用 art 中添加我们需要提供的异步服务和定时服务

vim art/tasks.py
在这里插入图片描述
上述我们把异步处理任务add和定时器任务 tsend_email 都放在了 tasks.py

(5)迁移生成 celery 需要的数据表

python manage.py migrate

此时数据库表结构多出了几个
在这里插入图片描述
3、启动服务,测试

我们可以采用 python manage.py help 发现多出了 celery 相关选项。

(1)启动 django celery 服务

启动服务:

python manage.py celery worker --loglevel=info

此时异步处理和定时处理服务都已经启动了

(2)web端接口触发异步任务处理

我们在web端加入一个入口,触发异步任务处理add函数

在应用art的urls.py 中加入如下对应关系
在这里插入图片描述

启动 web 服务,通过 url 传入的参数,通过 handler 的 add.delay(x, y) 计算并存入 mysql

http://127.0.0.1:8000/art/add?x=188&y=22

(4) 测试定时器,发送邮件

在终端输入 python manage.py celerybeat -l info

会自动触发每隔 30s 执行一次 tsend_email 定时器函数,发送邮件:
在这里插入图片描述

具体发送邮件服务程序见下面的第4节
4、邮件发送服务

项目中经常会有定时发送邮件的情形,比如发送数据报告,发送异常服务报告等。

可以编辑文件 art/utils/send_mail.py, 内容编辑如下:
在这里插入图片描述
至此,在 celery ui 界面可以看到两类,定时器处理和异步处理。
5、启动 flower 服务

python manager celery flower
案例
在这里插入图片描述
读书网站实现抢读功能

qd(request, id) :抢读视图函数

quereyQD(request,id) :查询抢读的视图函数

settings.py
在这里插入图片描述
在主工程目录添加 celery.py, 添加自动检索django工程tasks任务

celery.py
在这里插入图片描述
当前 app 目录下建立 tasks.py
在这里插入图片描述
views.py
在这里插入图片描述
前端通过定时器,每秒执行查询函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django 是一个非常流行的 web 框架,而 Celery 是一个 Python 分布式任务队列,它可以让我们方便地在 Django 实现定时任务。下面是一个简单的例子: 第一步是安装和配置 Celery。可以使用 pip 安装: ``` pip install celery ``` 然后在 Django 的 settings.py 文件添加以下配置: ``` CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_TIMEZONE = 'Asia/Shanghai' ``` 这里假设我们使用 Redis 作为消息代理和结果存储。 第二步是创建一个 Celery 应用。在 Django项目目录下创建一个 celery.py 文件,添加以下内容: ```python import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') app = Celery('your_project') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() ``` 这里的 your_project 是你的 Django 项目名称。 第三步是定义任务。在 Django 的某个 app 下创建一个 tasks.py 文件,添加以下内容: ```python from celery import shared_task from datetime import datetime @shared_task def print_time(): print(datetime.now().strftime('%Y-%m-%d %H:%M:%S')) ``` 这里定义了一个名为 print_time 的任务,它会打印当前时间。 第四步是配置定时任务。在项目目录下创建一个 tasks 目录,然后创建一个名为 beat.py 的文件,添加以下内容: ```python from celery import Celery from celery.schedules import crontab app = Celery() app.conf.timezone = 'Asia/Shanghai' app.conf.beat_schedule = { 'print_time': { 'task': 'your_app.tasks.print_time', 'schedule': crontab(minute='*/1'), }, } ``` 这里的 your_app 是你定义任务的 app 名称,这个配置会让 print_time 这个任务每分钟执行一次。 最后,在命令行启动 Celery: ``` celery -A your_project worker -l info -Ofair ``` 然后再打开一个命令行窗口,启动定时任务: ``` celery -A your_project beat -l info ``` 这样就完成了 Django 使用 Celery 实现定时任务的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值