溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Celery怎么創(chuàng)建

發(fā)布時間:2022-01-17 15:19:19 來源:億速云 閱讀:119 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Celery怎么創(chuàng)建”,在日常操作中,相信很多人在Celery怎么創(chuàng)建問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Celery怎么創(chuàng)建”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

Celery 是什么?

Celery(中文是芹菜的意思)是Python語言實現(xiàn)的分布式隊列服務(wù),除了支持即時任務(wù),還支持定時任務(wù),Celery 有5個核心角色。

Task

任務(wù)(Task)就是你要做的事情,例如一個注冊流程里面有很多任務(wù),給用戶發(fā)驗證郵件就是一個任務(wù),這種耗時的任務(wù)就可以交給Celery去處理,還有一種任務(wù)是定時任務(wù),比如每天定時統(tǒng)計網(wǎng)站的注冊人數(shù),這個也可以交給Celery周期性的處理。

Broker

Broker 的中文意思是經(jīng)紀(jì)人,指為市場上買賣雙方提供中介服務(wù)的人。在Celery中這個角色相當(dāng)于數(shù)據(jù)結(jié)構(gòu)中的隊列,介于生產(chǎn)者和消費(fèi)者之間經(jīng)紀(jì)人。例如一個Web系統(tǒng)中,生產(chǎn)者是主程序,它生產(chǎn)任務(wù),將任務(wù)發(fā)送給 Broker,消費(fèi)者是 Worker,是專門用于執(zhí)行任務(wù)的后臺服務(wù)。Celery本身不提供隊列服務(wù),一般用Redis或者RabbitMQ來實現(xiàn)隊列服務(wù)。

Worker

Worker 就是那個一直在后臺執(zhí)行任務(wù)的人,也成為任務(wù)的消費(fèi)者,它會實時地監(jiān)控隊列中有沒有任務(wù),如果有就立即取出來執(zhí)行。

Beat

Beat 是一個定時任務(wù)調(diào)度器,它會根據(jù)配置定時將任務(wù)發(fā)送給 Broker,等待 Worker 來消費(fèi)。

Backend

Backend 用于保存任務(wù)的執(zhí)行結(jié)果,每個任務(wù)都有返回值,比如發(fā)送郵件的服務(wù)會告訴我們有沒有發(fā)送成功,這個結(jié)果就是存在Backend中,當(dāng)然我們并不總是要關(guān)心任務(wù)的執(zhí)行結(jié)果。

Celery怎么創(chuàng)建

記住這5個角色后面理解Celery就輕松了。

快速入門

接觸任何新東西,沒有什么比實際動手學(xué)得更快了。假設(shè)我們選擇Redis作為broker,你需要安裝redis并且已經(jīng)啟動了redis服務(wù)(這個步驟請自行借用搜索引擎解決)

pip install -U "celery[redis]"

1、創(chuàng)建Celery實例

# tasks.py
from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379/0')

2、創(chuàng)建任務(wù)

假設(shè)這個發(fā)送郵件的任務(wù)需要5秒鐘才能執(zhí)行完

# tasks.py
@app.task
def send_mail(email):
   print("send mail to ", email)
   import time
   time.sleep(5)
   return "success"

在沒有Celery的情況下,程序順序執(zhí)行,每個步驟都需要等上一步執(zhí)行完成。

1. 插入記錄到數(shù)據(jù)庫
2. 發(fā)郵件
3. 注冊成功

我們可以把2放在一個任務(wù)中交給celery去執(zhí)行,這樣我們就不需要等待發(fā)郵件完成,你只需要安排celery去處理幫我去完成就好了。代碼就變成了

1. 插入記錄到數(shù)據(jù)庫
2. celery 幫我去發(fā)郵件
3. 注冊成功

第二步是非常快的,它只需要把任務(wù)放進(jìn)隊列里面去,并不會等任務(wù)真正執(zhí)行完。這跟生活是完全貼切的,例如我們很多事情都不是自己親歷其為去做,而是將一個不太重要或即時性沒那么高的事情轉(zhuǎn)交給別人處理。

3、啟動Worker

啟動Worker,監(jiān)聽 Broker 中是否有任務(wù),命令:celery worker,你可能需要指定參數(shù)

celery -A tasks worker --loglevel=info

-A: 指定 celery 實例所在哪個模塊中,例子中,celery實例在tasks.py文件中,啟動成功后,能看到信息

Celery怎么創(chuàng)建

函數(shù)用app.task 裝飾器修飾之后,就會成為Celery中的一個Task。

4、調(diào)用任務(wù)

在主程序中調(diào)用任務(wù),掉任務(wù)發(fā)送給 Broker, 而不是真正執(zhí)行該任務(wù)

# user.py
from tasks import send_mail

def register():
   import time
   start = time.time()
   print("1. 插入記錄到數(shù)據(jù)庫")
   print("2. celery 幫我發(fā)郵件")
   send_mail.delay("xx@gmail.com")
   print("3. 告訴用戶注冊成功")
   print("耗時:%s 秒 " % (time.time() - start))

if __name__ == '__main__':
   register()

在主程序中,調(diào)用函數(shù)的.delay方法

目錄結(jié)構(gòu):

── celery_test
   ├── tasks.py
   └── user.py

運(yùn)行 python user.py, 啟動應(yīng)用程序

1. 插入記錄到數(shù)據(jù)庫
2. celery 幫我發(fā)郵件
3. 告訴用戶注冊成功
耗時:0.22688984870910645 秒

程序花了不到0.23秒就執(zhí)行完成,如果按照正常的同步邏輯去執(zhí)行,至少需要5秒鐘,因為發(fā)郵件的任務(wù)就花了5秒。

在worker服務(wù)窗口看日志信息

Celery怎么創(chuàng)建

注意:

1、celery worker 啟動時,如果是root用戶,需要設(shè)置環(huán)境變量:

$ export C_FORCE_ROOT='true'

2、 Celery4.x 開始不再支持Windows平臺,如果需要在Windows開發(fā),請使用3.x的版本。

3、使用 RabbitMQ 或 Redis 作為 Broker,生產(chǎn)環(huán)境永遠(yuǎn)不要使用關(guān)系數(shù)據(jù)庫

4、不要使用復(fù)雜對象作為任務(wù)函數(shù)的參數(shù)

# 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)
   # ...

到此,關(guān)于“Celery怎么創(chuàng)建”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI