异步任务 ---- django-celery
大家都知道celery的使用,网上也有很多的教程。因为最近在使用django来完成项目,无意间发现有个东西叫django-celery,比celery的配置更加简单
首先需要统一一下使用的环境,以为如果redis的版本过高会报错
推荐版本
Django==2.2.6
django-celery==3.31
django-redis==4.11.0
redis==2.10.6
celery==3.1.26.post2
配置settings.py
因为本机直接有redis,在这里我们直接使用redis作为我们的broker.当然,如果你追求稳定性和效率,也可以使用rabbitMQ或者kafka.
#settings.pyimport djcelery djcelery.setup_loader() BROKER_URL = 'redis://127.0.0.1:6379/2' INSTALLED_APPS = [ ... "djcelery", ... ]
创建Celery所需的数据表
python manage.py migrate #如若不成功可以尝试一下命令语句 #python manage.py syncdb
创建task
在app里建立task.py文件来写入需要执行的异步任务
from celery import task @task def add(x,y): return x+y
a、当settings.py中的djcelery.setup_loader()运行时, Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件, 找到标记为task的function, 并将它们注册为celery task.
b、在执行djcelery.setup_loader()时, task是以INSTALLED_APPS中的app名, 加.tasks.function_name注册的
c、一次需要注意 在impprt task时, 需要保持一致
from rest_framework.views import APIView from rest_framework.response import Response from userapp.tasks import add class TestCeleryView(APIView): def get(self,request): data = add.delay(2,10) #delay是注册为celery异步任务的关键点 return Response({"code":200}) Views.py
启动celery
首先正常启动的django任务 然后启动celery服务即可
python manage.py celery worker --loglevel=info
如果报错不让超级管理员来启动,在settings.py中加入一下配置
from celery import Celery, platforms platforms.C_FORCE_ROOT = True
验证celery任务
在搞定上面的东西以后,你就可以通过postman来请求接口让接口使用celery来异步执行任务而不阻塞你的request请求。
注意
celery与3.7版本兼容问题
在 celery 官方的提议下,建议将 async 文件的文件名改成 asynchronous
Python37\Lib\site-packages\kombu\async
需要修改的文件
Python37\Lib\site-packages\celery\utils\timer2.py
Python37\lib\site-packages\celery\concurrency\asynpool.py
Python37\lib\site-packages\celery\worker\components.py
Python37\lib\site-packages\celery\worker\autoscale.py
Python37\lib\site-packages\celery\worker\consumer.py