最近写了一个Django项目,碰巧有个数据获取的功能延迟特别大(30s左右),严重影响用户的浏览体验,就想到了去尝试用celery解决。怎么说呢?会者不难,难者不会。这东西最初感觉挺简单的,搞了两天各种error,就找了一个视频系统的学习了一下,emmm还是有error。我这里主要是想通过Model来存数据,各种class引用报错,如果还不能解决的话都想过直接操作MySQL来写库了。
使用
我这里主要先说一下一个文件的使用方式吧,当然也可以搞一个类把task和配置文件等等分开尽量解耦,后续维护更方便。消息中间件选用的是Redis,当然你也可以选用mq等等。
- 在
models.py
同目录创建celery_task.py
,我这里主要是一个异步,定时任务的话也差不多。内容如下,主要注意的是django的引用以及models的引用。
from celery import Celery
import time
import os
import django
# 注意Project换成自己的项目名称
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Project.settings')
django.setup()
from test.models import article
backend='redis://127.0.0.1:6379/1' # 数据库存储异步结果
broker='redis://127.0.0.1:6379/2' # 消息中间件(0-16个,其中选一个)
# rabbitmq + celery5.1.2
# backend='rpc://guest@localhost//'
# broker='pyamqp://guest@localhost//'
cel=Celery('test',backend=backend,broker=broker) # ’test‘ celery的一个名字
@cel.task()
def getcontent():
article.objects.create(description ="description", content = "content")
- views.py
from .celery_task import getcontent
def IndexView(request):
# 用celery
getcontent.delay()
return render(request, 'test/index.html')
- 在项目路径下启动,这里主要注意一下celery5.x的启动方式以及gevent的参数以及module安装。
#celery5.x 启动
#celery --app test.celery_task worker -l info -P gevent
celery worker -A test.celery_task -l info -P gevent