什么是异步任务
后端接口接收到用户信息变更数据 -> 往数据库的2张表中写入该用户的数据。
正常运行顺序为:先写入表1 -> 再写入表2 -> 给用户返回信息更改成功的提示
先写入表1、再写入表2,相当于同一时间内,只做了一件事情。
异步运行顺序为:写入表1的同时,也在写入表2 -> 给用户返回信息更改成功的提示
写入表1的同时写入表2,相当于同一时间内,做了两件事情。
在服务器资源允许的情况下,异步运行可以提高接口的运行速度,更快地给用户返回结果,减少等待时间。
什么是celery
Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。即插即用,易于使用和维护,单个进程每分钟可以处理数百万个任务。
django-celery只是将任务发布出去,让长时间的任务:爬取一个网站,发送一个验证码这样的工作,不再阻塞主线程,web服务器只负责发起任务和接受任务的结果,中间执行的部分交给其他线程、进程、服务器去做。
可以看到,Celery 主要包含以下几个模块:
任务模块 Task
包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。
消息中间件 Broker
Broker,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列。Celery 本身不提供队列服务,官方推荐使用 RabbitMQ 和 Redis 等。
任务执行单元 Worker
Worker 是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它。
任务结果存储 Backend
Backend 用于存储任务的执行结果,以供查询。同消息中间件一样,存储也可使用 RabbitMQ, Redis 和 MongoDB 等。
celery使用指南
celery使用教程
redis兼容性问题解决方案
redis客户端操作指南
celery异步任务与调用返回值
为tasks.py设置django环境配置
顺序不能错
import os
import sys
import django
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 定位到django根目录
sys.path.append(os.path.abspath(os.path.join(BASE_DIR, os.pardir)))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoProject1.settings") # django的settings文件
django.setup()
celery 定时任务
在tasks.py之中更新app的设置
app.conf.update(
CELERYBEAT_SCHEDULE={
'do-task-everyday-func': {
'task': 'func',
'schedule': crontab(minute='30', hour='10', day_of_week='*',
day_of_month='*', month_of_year='*')
}
})
随后启动定时任务的beat程序执行
celery -A tasks beat --loglevel=info