zoukankan      html  css  js  c++  java
  • 异步任务 ---- 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
    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。
    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
    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

    Python37Libsite-packageskombuasync

    需要修改的文件
    Python37Libsite-packagesceleryutils imer2.py

    Python37libsite-packagesceleryconcurrencyasynpool.py

    Python37libsite-packagesceleryworkercomponents.py

    Python37libsite-packagesceleryworkerautoscale.py

    Python37libsite-packagesceleryworkerconsumer.py

     

  • 相关阅读:
    团队项目启动及成员分工
    图书馆 管理系统--可行性报告
    KING小组
    什么是F#
    都删了,走了
    机器学习-决策树
    深度学习--说一说卷积和池化
    机器学习--逻辑回归_LR(内附细说极大似然估计,梯度下降法)
    Dlib安装(Mac版)
    动态语言、静态语言及动态语言的“鸭子类型“
  • 原文地址:https://www.cnblogs.com/wanglisen/p/13937535.html
Copyright © 2011-2022 走看看