近期用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。


推薦閱讀:
相关文章