需用场景
celery功能强大,但对服务器的性能消耗也大,其次维护成本也不小,所以先搞清楚什么样的场景使用使用celery。
- 并发需求大,需要做异步的延时队列。比如说:下单任务,如果体量小的应用,1秒并发也就不到10笔订单,那就可以忽略异步延时操作。但是如果可以达到1秒2000笔订单,那么就得上异步延时队列了。大体上的操作思路就是:客户端发起下单请求,服务把下单操作放到一个异步的延时队列去操作,然后返回客户端下单操作已接受,等待下单成功的通知。
- 需要定时执行任务或者计时执行任务队列。比如:30分钟取消待支付订单,每隔1个小时刷新Redis缓存数据等。
使用依赖
# 笔者的开发环境是:python 3.6 django 2.2.6
pip install celery
pip install django-celery-results # 支持将任务结果存储到Django的ORM中
pip install django-celery-beat # 支持定时任务
你还需要搭建好RabbitMQ
服务。
lucky-mall
├── celerybeat-schedule.db
├── lucky
│ ├── __init__.py
│ ├── celery.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── mall
│ ├── __init__.py
│ ├── admin.py
│ ├── api
│ ├── apps.py
│ ├── migrations
│ ├── model
│ ├── tasks.py
│ └── urls.py
└──
代码实现
在setting.py里添加配置
INSTALLED_APPS = [
...
'django_celery_beat',
'django_celery_results'
]
# Broker配置,使用RabbitMQ作为消息中间件
CELERY_BROKER_URL = 'amqp://user:password@host:port'
# 使用django orm 作为结果存储
CELERY_RESULT_BACKEND = 'django-db'
# 结果序列化方案
CELERY_RESULT_SERIALIZER = 'json'
在项目管理目前下lucky-mall/lucky
里添加celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lucky.settings') # 设置django环境 lucky是笔者的项目,开发者填写自己的项目名
app = Celery('lucky') # lucky是笔者的自定义的APP名,开发者也可以自定义
app.config_from_object('django.conf:settings', namespace='CELERY') # 使用CELERY_ 作为前缀,在settings中写配置
app.autodiscover_tasks() # 发现任务文件每个app下的tasks.py
在项目管理目前下lucky-mall/lucky/__init__.py
里添加
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']
按需在app目录下面建tasks.py
文件,并创建任务
from celery import shared_task
from .model.order.order import Order
# 检查还有多少条待支付的订单,返回其数量
@shared_task
def check_cancel_order():
order_data = Order.objects.filter(order_status=Order.order_status_unpaid)
return {'order_cancel_length': order_data.count()}
执行验证
执行migrate
命令,完成数据库模型的迁移
python manage.py migrate
启动celery,celery需要额外的命令启动(生产环境部署时,最好使用守护线程来启动,比如:supervisor
)
# 启动定时执行调度 其中 lucky 是celery app名,开发者改为自己的
celery -A lucky beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
# 启动worker 其中 lucky 是celery app名,开发者改为自己的
celery -A lucky worker -l info
# 启动django
python manage.py runserver
执行完,启动admin页面,可以看到如下模型
下一步
- 如何在业务代码中将延时任务加入队列中执行?
- 如何设置延时任务指定时间后执行?
- 如何设置定时任务,并执行?