天天看點

flask中celery介紹及使用celery實作異步任務

參考資料:

Celery 官網:http://www.celeryproject.org/

Celery 官方文檔英文版:http://docs.celeryproject.org/en/latest/index.html

Celery 官方文檔中文版:http://docs.jinkan.org/docs/celery/

Celery簡介

除Celery是一個異步任務的排程工具。 Celery 是 Distributed Task Queue,分布式任務隊列,分布式決定了可以有多個 worker 的存在,隊清單示其是異步操作,即存在一個産生任務提出需求的工頭,和一群等着被配置設定工作的碼農。

Broker

在 Python 中定義 Celery 的時候,我們要引入 Broker(消息中間件),中文翻譯過來就是“中間人”的意思,在這裡 Broker 起到一個中間人的角色。在工頭提出任務的時候,把所有的任務放到 Broker 裡面,在 Broker 的另外一頭,一群碼農等着取出一個個任務準備着手做。

Backend

這種模式注定了整個系統會是個開環系統,工頭對于碼農們把任務做的怎樣是不知情的。是以我們要引入 Backend 來儲存每次任務的結果。這個 Backend 有點像我們的 Broker,也是存儲任務的資訊用的,隻不過這裡存的是那些任務的傳回結果。我們可以選擇隻讓錯誤執行的任務傳回結果到 Backend,這樣我們取回結果,便可以知道有多少任務執行失敗了。

Celery應用場景

1.你想對100台機器執行一條批量指令,可能會花很長時間 ,但你不想讓你的程式等着結果傳回,而是給你傳回 一個任務ID,你過一段時間隻需要拿着這個任務id就可以拿到任務執行結果, 在任務執行ing進行時,你可以繼續做其它的事情。

2.你想做一個定時任務,比如每天檢測一下你們所有客戶的資料,如果發現今天 是客戶的生日,就給他發個短信祝福

Celery的特點

1.簡單:一單熟悉了celery的工作流程後,配置和使用還是比較簡單的

2.高可用:當任務執行失敗或執行過程中發生連接配接中斷,celery 會自動嘗試重新執行任務

3.快速:一個單程序的celery每分鐘可處理上百萬個任務

3.靈活: 幾乎celery的各個元件都可以被擴充及自定制

Celery工作基本流程

flask中celery介紹及使用celery實作異步任務

Celery的安裝

在flask中,打開終端直接執行一下指令即可安裝:

pip install celery
           

因為我們在使用celery的過程中,需要用到redis資料庫,請事先配置好redis資料庫,確定資料庫可以正常使用。

開始使用Celery

看一下程式目錄

flask中celery介紹及使用celery實作異步任務

我們把main.py作為啟動檔案,config.py裡面包含celery的配置資訊,sms目錄下的tasks.py(這個名字不能變,隻能是這個)裡面是我們要去執行的任務,這個例子是實作了一個網站注冊界面實作異步任務給使用者發送注冊資訊的功能。因為發送短信我們是依托于第三方平台,當我們需要發送短信的時候,需要向第三方平台發送請求與傳遞資料,是以這是一個耗時的操作,我們使用異步任務來提升使用者的體驗度。

下面就來看一下代碼:

main.py

#coding:utf-8
from celery import Celery

app=Celery("ihome")
app.config_from_object("ihome.tasks.config")
#讓celery自己找到任務
app.autodiscover_tasks(["ihome.tasks.sms"])
           

config.py

#coding:utf-8
#配置worker
BROKER_URL="redis://127.0.0.1:6379/5"
#配置backend
CELERY_RESULT_BACKEND="redis://127.0.0.1:6379/6"
           

tasks.py

#coding:utf-8
from celery import Celery

from ihome.libs.yuntongxun.sms import CCP

#建立celery對象
app=Celery("ihome",broker="redis://127.0.0.1:6379/5")

#定義任務
@app.task
def send_template_sms(to,datas,temp_id):
    '''發送短信'''
    #調用第三方平台發送短信程式
    ccp=CCP()
    ret=ccp.sendTemplateSMS(to,datas,temp_id)
    return ret
           

在我們後端程式中,在需要發送短信的地方使用以下語句:

tasks.send_template_sms.delay(mobile,[sms_code, str(constants.SMS_CODE_REDIS_EXPIRES / )],)
           

delay裡面的參數可以根據你使用的第三方平台來确定。