您好,登錄后才能下訂單哦!
這篇文章主要介紹“Celery怎么創建”,在日常操作中,相信很多人在Celery怎么創建問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Celery怎么創建”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Celery(中文是芹菜的意思)是Python語言實現的分布式隊列服務,除了支持即時任務,還支持定時任務,Celery 有5個核心角色。
任務(Task)就是你要做的事情,例如一個注冊流程里面有很多任務,給用戶發驗證郵件就是一個任務,這種耗時的任務就可以交給Celery去處理,還有一種任務是定時任務,比如每天定時統計網站的注冊人數,這個也可以交給Celery周期性的處理。
Broker 的中文意思是經紀人,指為市場上買賣雙方提供中介服務的人。在Celery中這個角色相當于數據結構中的隊列,介于生產者和消費者之間經紀人。例如一個Web系統中,生產者是主程序,它生產任務,將任務發送給 Broker,消費者是 Worker,是專門用于執行任務的后臺服務。Celery本身不提供隊列服務,一般用Redis或者RabbitMQ來實現隊列服務。
Worker 就是那個一直在后臺執行任務的人,也成為任務的消費者,它會實時地監控隊列中有沒有任務,如果有就立即取出來執行。
Beat 是一個定時任務調度器,它會根據配置定時將任務發送給 Broker,等待 Worker 來消費。
Backend 用于保存任務的執行結果,每個任務都有返回值,比如發送郵件的服務會告訴我們有沒有發送成功,這個結果就是存在Backend中,當然我們并不總是要關心任務的執行結果。
記住這5個角色后面理解Celery就輕松了。
接觸任何新東西,沒有什么比實際動手學得更快了。假設我們選擇Redis作為broker,你需要安裝redis并且已經啟動了redis服務(這個步驟請自行借用搜索引擎解決)
pip install -U "celery[redis]"
# tasks.py
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
假設這個發送郵件的任務需要5秒鐘才能執行完
# tasks.py
@app.task
def send_mail(email):
print("send mail to ", email)
import time
time.sleep(5)
return "success"
在沒有Celery的情況下,程序順序執行,每個步驟都需要等上一步執行完成。
1. 插入記錄到數據庫 2. 發郵件 3. 注冊成功
我們可以把2放在一個任務中交給celery去執行,這樣我們就不需要等待發郵件完成,你只需要安排celery去處理幫我去完成就好了。代碼就變成了
1. 插入記錄到數據庫 2. celery 幫我去發郵件 3. 注冊成功
第二步是非常快的,它只需要把任務放進隊列里面去,并不會等任務真正執行完。這跟生活是完全貼切的,例如我們很多事情都不是自己親歷其為去做,而是將一個不太重要或即時性沒那么高的事情轉交給別人處理。
啟動Worker,監聽 Broker 中是否有任務,命令:celery worker
,你可能需要指定參數
celery -A tasks worker --loglevel=info
-A: 指定 celery 實例所在哪個模塊中,例子中,celery實例在tasks.py文件中,啟動成功后,能看到信息
函數用app.task 裝飾器修飾之后,就會成為Celery中的一個Task。
在主程序中調用任務,掉任務發送給 Broker, 而不是真正執行該任務
# user.py
from tasks import send_mail
def register():
import time
start = time.time()
print("1. 插入記錄到數據庫")
print("2. celery 幫我發郵件")
send_mail.delay("xx@gmail.com")
print("3. 告訴用戶注冊成功")
print("耗時:%s 秒 " % (time.time() - start))
if __name__ == '__main__':
register()
在主程序中,調用函數的.delay
方法
目錄結構:
── celery_test ├── tasks.py └── user.py
運行 python user.py, 啟動應用程序
1. 插入記錄到數據庫 2. celery 幫我發郵件 3. 告訴用戶注冊成功 耗時:0.22688984870910645 秒
程序花了不到0.23秒就執行完成,如果按照正常的同步邏輯去執行,至少需要5秒鐘,因為發郵件的任務就花了5秒。
在worker服務窗口看日志信息
1、celery worker 啟動時,如果是root用戶,需要設置環境變量:
$ export C_FORCE_ROOT='true'
2、 Celery4.x 開始不再支持Windows平臺,如果需要在Windows開發,請使用3.x的版本。
3、使用 RabbitMQ 或 Redis 作為 Broker,生產環境永遠不要使用關系數據庫
4、不要使用復雜對象作為任務函數的參數
# Good
@app.task
def my_task(user_id):
user = User.objects.get(id=user_id)
print(user.name)
# ...
# Bad
@app.task
def my_task(user):
print(user.name)
# ...
到此,關于“Celery怎么創建”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。