celery非同步任務 傳送簡訊驗證碼

2021-10-25 03:58:46 字數 2999 閱讀 1107

引入

我們在進行註冊賬號業務中,由**(django)生成傳送簡訊訊息,我們前面是交給第三方服務雲通訊來傳送簡訊驗證碼的,這一過程依賴網路。如果乙個使用者在註冊的時候網路很差,則會導致傳送簡訊的過程一直堵塞,導致前端介面一直得不到資料返回。這不是我們希望看到的。

如下圖:

解決方案

我們把傳送簡訊這一任務交給另外乙個非同步服務程式去處理,便可以解決堵塞的問題

實現邏輯

介紹:

celery 是乙個簡單、靈活且可靠、處理大量訊息的分布式系統,可以在一台或者多台機器上執行。

特點:1、單個 celery 程序每分鐘可處理數以百萬計的任務.

2、通過訊息進行通訊,使用訊息佇列( 中間人或broker )生產者消費者之間進行協調。

3、celery官方文件

4、celery中文文件

0、安裝依賴
pip install celery -i
1、在django工程中找乙個合適的地方,構建如下目錄(注意:非同步任務task.py名字固定)

2、編輯檔案main.py

"""

main.py模組,作為非同步服務的主指令碼;

該檔案中,定義非同步應用物件

"""from celery import celery

# 1、初始化乙個非同步應用程式物件

'meiduo'

)# 2、載入配置檔案(配置檔案的導包路徑)

'celery_tasks.config'

)# 3、定義好任務之後,需要在非同步任務應用物件中註冊該任務(列表,可以註冊多個任務)

['celery_tasks.sms'

,# 非同步任務包(第四步的任務)的導包路徑

])

3、編輯配置檔案config.py訊息佇列可以有三種方式,這裡我麼使用redis為例

# 如果使用 redis 作為中間人——任務佇列(訊息佇列)———作用:暫存任務的地方

# 需要這樣配置:

broker_url =

'redis:'

# 如果需要密碼的話

# broker_url='redis:'

# 如果使用別的作為中間人, 例如使用 rabbitmq

# 則 rabbitmq 配置如下:

# 例如:

# meihao: 在rabbitq中建立的使用者名稱, 注意: 遠端鏈結時不能使用guest賬戶.

# 123456: 在rabbitq中使用者名稱對應的密碼

# ip部分: 指的是當前rabbitq所在的電腦ip

# 5672: 是規定的埠號

# broker_url = 'amqp:'

4、編輯非同步任務檔案tasks.py(檔名稱固定)
"""

該模組固定名稱tasks.py

"""from celery_tasks.yuntongxun.ccp_sms import ccp

# name:別名,隨便起

"ccp_send_sms_code"

)def

ccp_send_sms_code

(mobile, sms_code)

:"""

功能:傳送簡訊

:param mobile: 手機號

:param sms_code: 簡訊驗證碼

:return: 可有可無

"""result = ccp(

).send_template_sms(

mobile,

[sms_code,5]

,1)return result

5、修改新增之前的傳送簡訊介面**
# 2.3 發布"傳送簡訊"任務,交給非同步程式去執行,此處不會阻塞

6、進入非同步任務包所在目錄,啟動非同步服務

啟動非同步服務命令引數說明:

celery: 呼叫 celery 命令

-a: 作用是指定要啟動的檔案, 這個引數後面的檔案會被執行.

worker: 啟動的物件是 worker, 工人, 幹活的人

-l: 指日誌列印等級, 一般日誌都是通知形式的, 即: info 級別

7、測試:

8、結論:

在斷網的情況下,前端依然正常執行,也能得到資料返回,說明非同步任務生效了

celery非同步傳送簡訊

celery專案中的所有導包位址,都是以celery base dir為基準設定 執行celery命令時,也需要進入celery base dir目錄執行 celery base dir os.path.dirname os.path.abspath file def send sms code s...

celery非同步任務傳送簡訊驗證碼

進行處理,處理之後把結果儲存到backend中。在mian.py中主要是celery的主程式 from celery import celery import os if not os.getenv django settings module os.environ django settings ...

使用celery非同步傳送簡訊

1.1 在 celery task mian.py 中新增傳送簡訊函式 celery專案中的所有導包位址,都是以celery base dir為基準設定.執行celery命令時,也需要進入celery base dir目錄執行.celery base dir os.path.dirname os.p...