异步任务-----django-celery

异步任务 ---- django-celery

 

 

大家的知道celery的使用,网上也有很多的教程。因为最近在使用django来完成项目,无意间发现发现有个东西叫django-celery,比celery的配置更加的简单,这里分享一下。

首先需要统一一下使用的环境,以为如果redis的版本过高会报错

 

 

 推荐版本  

  Django == 2.2.6

  django-celery == 3.3.1

  django-redis == 4.11.0

  redis == 2.10.6

  celery == 3.1.26.post2

 

配置settings.py

  因为本机直接有redis,在这里我们直接使用redis作为我们的broker。当然,如果你追求稳定性和效率,也可使使用rabbitMQ或者kafka。  

复制代码
#settings.py

import 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里建立tasks.py文件来写入需要执行的异步任务

 

 

 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时, 需要保持一致

  d、如果我们由于python path不同而使用不同的引用方式时(例如在tasks.py中使用from myproject.myapp.tasks import add形式), Celery将无法得知这是同一task, 因此可能会引起奇怪的bug。
 

让任务变成异步

  例如我们希望在用户发出request后异步执行该task, 马上返回response, 从而不阻塞该request, 使用户有一个流畅的访问过程. 那么, 我们可以使用.delay。

 Views.py

 

 

 

# -*- coding: utf-8 -*-
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from syl.settings import ALY_ACCESSKEY_ID,ALY_ACCESSKEY_SECRET
import json,time
from celery import task




@task
def send_sms(phone,data):

    client = AcsClient(ALY_ACCESSKEY_ID,
                       ALY_ACCESSKEY_SECRET,
                       'cn-hangzhou')

    request = CommonRequest()
    request.set_accept_format('json')
    request.set_domain('dysmsapi.aliyuncs.com')
    request.set_method('POST')
    request.set_protocol_type('https')  # https | http
    request.set_version('2017-05-25')
    request.set_action_name('SendSms')

    request.add_query_param('RegionId', "cn-hangzhou")
    request.add_query_param('PhoneNumbers',phone)
    request.add_query_param('SignName', "美多商城")
    request.add_query_param('TemplateCode', "SMS_205402983")
    request.add_query_param('TemplateParam',data)

    response1 = client.do_action(request)
    # python2:  print(response)
    print(str(response1, encoding='utf-8'))
    res = json.loads(str(response1,encoding='utf-8'))
    time.sleep(5)
verifications/tasks.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

 

  
 
 
 
posted @ 2020-11-04 19:13  王彬。  阅读(176)  评论(2)    收藏  举报