異步任務 ---- 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文件來寫入需要執行的異步任務

 

 

 

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

 

啟動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

 

  
 
 
 
 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM