celery mysql 非同步 Celery非同步

2021-10-19 01:36:13 字數 3948 閱讀 7117

celery

celery是乙個功能完備即插即用的非同步任務佇列框架。它適用於非同步處理問題,當傳送郵件/簡訊、或者檔案上傳, 影象處理等等一些比較耗時的操作,我們可將其非同步執行,這樣使用者不需要等待很久,提高使用者體驗。

celery的特點是:簡單,易於使用和維護,有豐富的文件。

高效,單個celery程序每分鐘可以處理數百萬個任務。

靈活,celery中幾乎每個部分都可以自定義擴充套件。

任務佇列是一種跨執行緒、跨機器工作的一種機制.

任務佇列中包含稱作任務的工作單元。有專門的工作程序持續不斷的監視任務佇列,

並從中獲得新的任務並處理.

celery通過訊息進行通訊,通常使用乙個叫broker(中間人)來協client(任務的發出者)和worker(任務

的處理者). clients發出訊息到佇列中,broker將佇列中的資訊派發給worker來處理。

celery的架構

celery的架構由三部分組成,訊息佇列(message broker),任務執行單元(worker)和任務執行結果儲存(task result store)組成。

乙個celery系統可以包含很多的worker和broker

celery本身不提供訊息佇列功能,但是可以很方便地和第三方提供的訊息中介軟體進行整合,包括rabbitmq,redis,mysql,mongodb等

如果將來專案中存在大批量,併發量高的非同步任務,則務必使用rabbitmq.

如果將來專案中存在少批量,併發量低的非同步任務,則建議使用redis.

安裝注意:celery是乙個python編寫的庫,所以如果在windows安裝建議不要安裝4.0.0以上版本,因為有bug

linex下安裝

pip install -u celery==4.3.0

tar xvfz celery-0.0.0.tar.gz

cd celery-0.0.0

python setup.py build

python setup.py install

使用一般在django中使用celery有2種方式:直接使用原生的celery作為乙個單獨的框架目錄來使用。**和django**進行分離

直接使用django-celery包,作為django的乙個包使用。**和django**合併在一塊,celery的配置就是django的配置檔案中編寫。

一般celery任務目錄直接放在專案的根目錄下即可,路徑:

renranapi/

├── mycelery/

├── config.py # 配置檔案

├── __init__.py

├── main.py # 主程式

└── sms/ # 乙個目錄可以放置多個任務,該目錄下存放當前任務執行時需要的模組或依賴

└── tasks.py # 任務的檔案,名稱必須是這個!!!

├── renranapi/ # 這是django的主應用目錄

main.py,**:

# 主程式

from celery import celery

# 建立celery例項物件

# 自動搜尋並載入任務

# 引數必須必須是乙個列表,裡面的每乙個任務都是任務的路徑名稱

# 啟動celery的命令

# 強烈建議切換目錄到專案的根目錄下啟動celery!!

# celery -a mycelerymain worker --loglevel=info

配置檔案config.py,**:

# 任務佇列的鏈結位址

broker_url = 'redis:'

# 結果佇列的鏈結位址

result_backend = 'redis:'

建立乙個任務檔案sms/tasks.py,並建立任務,**:

# celery的任務必須寫在tasks.py的檔案中,別的檔名稱不識別!!!

def send_sms():

print("傳送簡訊!!!")

def send_sms2():

print("傳送簡訊任務2!!!")

接下來,我們執行celery,效果如下:

在專案程式中呼叫上面的非同步任務,拿django進行舉例:

# 呼叫celery執行非同步任務

from mycelery.sms.tasks import send_sms

send_sms.delay(mobile) # 這裡表示發布任務到任務佇列中

接下來,我們需要把celery和django組合起來一起使用。

把django和celery進行組合

在main.py主程式中對django的配置檔案進行載入

# 主程式

import os

from celery import celery

# 建立celery例項物件

# 把celery和django進行組合,識別和載入django的配置檔案

os.environ.setdefault('django_settings_module', 'luffyapi.settings.dev')

# 對django框架執行初始化

import django

django.setup()

# 載入任務

# 引數必須必須是乙個列表,裡面的每乙個任務都是任務的路徑名稱

# 啟動celery的命令

# 強烈建議切換目錄到mycelery根目錄下啟動

# celery -a main worker --loglevel=info

在需要使用django配置的任務中,直接載入配置,所以我們把註冊的簡訊傳送功能,整合成乙個任務函式,**:

from .yuntongxun.sms import ccp

from luffyapi.settings import constants

import logging

log = logging.getlogger("django")

# def send_sms(mobile):

# print("傳送簡訊給%s的非同步任務執行了" % mobile)

# return "任務結果!"

def send_sms(mobile, sms_code):

"""非同步傳送簡訊"""

ccp = ccp()

try:

result = ccp.send_template_sms(mobile, [sms_code, constants.sms_expire_time//60 ], constants.sms_template_id)

return result

except:

log.error("傳送簡訊驗證碼失敗!手機號:%s" % mobile)

在這個任務中,我們需要載入簡訊傳送的sdk和相關的配置常量,所以我們可以直接把django中的簡訊傳送模組和相關的常量配置檔案直接剪下到當前sms任務目錄中

mycelery/

├── config.py

├── __init__.py

├── main.py

└── sms/

├── constant.py

├── __init__.py

├── tasks.py

└── yuntongxun

├── ccprestsdk.py

├── __init__.py

├── sms.py

└── xmltojson.py

再次啟動專案即可。

最終在django裡面,我們呼叫celery來非同步執行任務。需要完成2個步驟:

# 1. 宣告乙個和celery一模一樣的任務函式,但是我們可以導包來解決

from mycelery.sms.tasks import send_sms

# 2. 呼叫任務函式,發布任務

send_sms.delay(mobile,code)

# send_sms.delay() 如果呼叫的任務函式沒有引數,則不需要填寫任何內容

CE 執行緒小記

wince中,在編寫執行緒的時候,發現乙個問題。如果在建立執行緒的時候不設定執行緒的優先順序,會發現執行緒建立了兩個及以上就會出現卡的情況。當設定了優先順序後,就沒有這樣的情況了。在此記錄一下該情況,免得到時忘記了。下面是個例子 dword idthread 建立ui處理執行緒 huithread ...

CE 執行緒小記

wince中,在編寫執行緒的時候,發現乙個問題。如果在建立執行緒的時候不設定執行緒的優先順序,會發現執行緒建立了兩個及以上就會出現卡的情況。當設定了優先順序後,就沒有這樣的情況了。在此記錄一下該情況,免得到時忘記了。下面是個例子 dword idthread 建立ui處理執行緒 huithread ...

C E 聚集 深淺拷貝

概念 類的成員中含有某類的指標或者引,這種類間關係叫做類的聚集。又稱為 遠端所有權 該類的物件將資料存放在資料外面,物件只存放物件的位址或別名。資料可以是陣列,別的類的物件等。聚集類建構函式 在建構函式中一定要對指標初始化,若尚未確定指向,應置 null 但若類的聚集是用引用實現的,則不能不確定指向...