Celery處理異步任務使得程序不必等待任務結束就可以繼續執行其它任務或返回數據結果, 在處理耗時任務如發送郵件、發送信息驗證碼等場景下非常適用!
Celery使用方法靈活,根據具體業務有不同的部署和使用方法,經常會遇到的一個問題:在使用命令啟動Celery時,任務沒有注冊或其它錯誤,導致無法正常調用Celery,這里舉例幾種常見的情況,說明錯誤和解決方案,供大家參考!
1.版本問題
在Linux和window中或Django和Flask中使用Celery,版本不同或擴展插件不同(如django-celery 3.3.0 djangocelery 0.1.1 Flask-Celery 2.4.3 Flask-Celery3 celery 4.3.0 等等)會導致無法使用Celery!筆者使用Flask框架配合celery 4.3.0版本,使用正常!
————————————————
2.沒有注冊tasks
如下圖代碼,如果沒有添加任務到Celery的autodiscover_tasks方法中,同樣也是不會有作用的!
"""啟動文件"""
from celery import Celery
from celery_tasks import celeryconfig
# 定義celery app:名稱
celery_app = Celery("YOYO")
# 加載配置
celery_app.config_from_object(celeryconfig)
# 自動發現和注冊tasks
celery_app.autodiscover_tasks(["celery_tasks.test1",
"celery_tasks.test2",
"celery_tasks.test3",])
3.代碼或語法不對
如果使用自定義Celery裝飾函數的方式,在其它地方調用,那么tasks.py名稱是固定的,必須是這個名字,才能檢測到!
在使用裝飾器裝飾函數時,task而不是tsaks!
4.定義處理Celery的函數和調用體在同一文件,也是不起效!
5.使用了外部引用或其它本文件無法知曉的引用!
因為Celery是可獨立於程序運行的,需要單獨的啟動,如果在任務處理的函數中引用了其它對象,是無法識別的,如下圖舉例:
from pymongo import MongoClient
from celery_tasks.main import celery_app
import datetime
# from settings import MongoClient_conn
MongoClient_conn = MongoClient('127.0.0.1', 27017) # 連接mongodb
如果使用from settings import MongoClient_conn方式從項目主配置文件settings引入數據庫的連接,是不起效的,因為此py腳本不知道settings是什么 所以要引入MongoDB的客戶端連接才行!可以在celery的配置文件配置連接,這樣在celery任務中引用是行的!
以上就是筆者使用Celery的一些經驗,希望對大家有用!
————————————————
版權聲明:本文為CSDN博主「我變了_我沒變」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/anyedianxia/article/details/90763069