Celery+Flask的使用小結(初級)
近期用Flask做自己的博客,發送驗證郵件的功能嘗試用Celey這種非同步隊列系統實現。
對於Celery不熟悉的可點開鏈接,董偉明的Celery詳解
1.簡單實現
最簡單的實現就是將Celery和app寫在一個文件中,如下:
由於這個博客比較簡單,所以郵件任務沒有設置結果處理。(可利用delay()後返回的AsyncResul對象查看任務狀態)
2.工廠函數中的使用
在比較複雜一點的項目中,一般都使用工廠函數初始化app。這種單文件的結構一般只能做講解demo.在我的項目中,使用了如下的結構:
__init__.py 寫創建app的工廠函數,初始化插件;exts.py引入各類插件實例;tasks.py寫非同步任務。
但是為了方便其他flask插件使用Celery,我在__init__.py專門寫了一個create_celery()函數:
這個函數中重點就是ContextTask類。它繼承了celery.Task,並在其中改造了一下__call__()方法——加了一個app上下文環境。這樣一來,tasks.py中所有任務都不需要顯示的生成app上下文了。如下:
這也是Flask文檔中推薦的集成方式,Flask文檔。如果項目中大部分任務都不需要用到app上下文環境,那麼這種集成方式就有待商榷了。
async_send_email()這個任務中我顯示的傳入了序列化方式『pickle』。因為Celery默認接收內容的序列化方式為json,flask_mail的Message對象似乎只支持pickle,用json會報錯。還要在celery的配置中修改CELERY_ACCEPT_CONTENT :
CELERY_ACCEPT_CONTENT = [json, pickle]
3.啟動Celery:
在項目的根目錄下(一般是app文件夾所在的目錄)輸入:
celery -A app.tasks worker -l info
一般情況正常就會啟動:
項目上線的話應該還要添加Supervisor,來管理celery
4.最後
由於項目比較小,沒有大規模的Celery的使用,所以只有這種初級低配版,算是對自己使用的一個記錄。如果想理解更多的Celery特性,還是要查看我開頭鏈接的文章,或者看狗書作者Grinberg的這篇博客,簡單易懂的兩個Demo。
推薦閱讀: