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 但若類的聚集是用引用實現的,則不能不確定指向...