1. 程式人生 > >Celery 使用(一)

Celery 使用(一)

目錄 highlight tex lan div eight 周期性 就會 分發

Celery 使用(一)

架構

  1. Producer:任務發布者;
  2. Celery Beat:任務調度器,Beat進程會讀取配置文件中的內容,周期性的將配置中到期需要執行的任務發送給任務隊列;
  3. Broker:消息代理,接受生產者的任務消息,存進隊列後發送給消費者;
  4. Celery Worker:執行任務的消費者;
  5. Result Backend:保存消費者執行任務完後的結果;

如下圖:

技術分享

整體的流程,任務發布者或者是任務調度,將任務發送到消息代理中,接著消息代理將任務發送給消費者來執行,其執行完後將結果保存到backend中。

使用

先創建Celery實例和相關的任務,這裏配置Celery可以通過創建一個配置文件,然後通過app.config_from_object(‘proj.celeryconfig‘)

加載即可。

task.py如下

from celery import Celery
app = Celery(‘tasks‘, backend=‘amqp‘, broker=‘amqp:[email protected]:5672//‘)
@app.task
def add(x, y):
    return x + y

接下來,創建相關的任務發布者,run_task.py如下

from task2 import add
result = add.delay(1,1)
import time
while not result.ready():
    print(‘not yet ready‘
) time.sleep(1) print(result.get())

然後在項目目錄中,通過命令執行Celery,命令如下:

celery -A task2.app worker --loglevel=info

如果看到命令行裏顯示該實例的所有任務說明執行成功,最後再開一個進程執行任務,接著就會看到命令行中的提示信息,說明消費者執行成功,並且將結果保存到backend中。

技術分享

一個簡單的用例就結束了。

疑惑

之前有一個疑惑的點在於,既然RabbitMQ可以實現任務隊列,要Celery有何用呢?

從我搜索到的知識來看,有以下幾點:

  1. Celery可以支持多種消息代理,不僅僅是RabbitMQ,還有Redis、MongoDB等等;
  2. RabbitMQ是消息隊列,其可以應用到各種場景中,包括任務分發系統,也就是需要自己實現一個Celery,而Celery本身就是一個任務分發系統,顯然簡化了代碼,不需要重復造輪子;

Celery 使用(一)