Celery 學習筆記(1)簡介

簡介

Celery 是一個用 Python 編寫的異步的任務調度模塊,它有着簡明的 API,並且有豐富的擴展性,適合用於構建分佈式的 Web
服務。Celery 的工作流程很簡單,你可以給Celery提交一個任務,然後 Celery 會將任務放入消息隊列 broker 中,後臺啓動的多
個 worker 並行的對任務進行執行,最後可以選擇將執行結果寫入 store 中。

文件

一個簡單的示例

Celery 支持多種中間人作爲消息隊列,包括 RabbitMQ,Redis,數據庫,Amazon SQS 等等,但是官方推薦 RabbitMQ 和Redis,這裏我選擇了 Redis 作爲示例。所以需要提前安裝 Celery 和 Redis,官方提供了一種簡單的安裝方法,可以同時安Celery 和 Redis 相關的依賴,以及安裝 Redis,然後把 Redis 運行起來。

>>> sudo pip install -U "celery[redis]"
>>> sudo apt-get install redis-server
>>> sudo redis-server

在使用 Celery 的過程中主要的步驟是 (1)定義一個應用,並在應用上註冊任務;(2)啓動 worker,通過消息隊列等待任務; (3)通過在程序裏調用預先註冊的任務給 Celery 提交一個任務。
tasks.py 包含了一個簡單的示例,主要進行了任務的註冊,首先創建了一個 Celery 實例 app,這是 Celery 裏的一個應用(Application),第一個參數是應用 名,Celery 的 worker 通過這個名字尋找應用;第二個參數是 broker 這裏設置爲本機的Redis Server。然後通過 app.task 裝飾器爲 app 這個應用註冊一個任務。

# cele.py
from celery import Celery

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

@app.task
def add(x, y):
    return x + y

然後可以通過如下命令啓動 worker, 其中 -A 參數用於指定在 tasks.py 裏定義的應用的名字,–loglevel 用於指定日誌的記錄等級

>>> celery -A cele worker --loglevel=info

應該會看到一個大致這樣的啓動界面,下面解釋下 [config] 的大致含義,其中 app 是 worker 對應的應用名,transport 是指在前面制定的消息隊列地址,results 是指 任務執行結果存儲的地方,但是這裏沒有指定,所以默認就是關閉的。concurrency 是 worker 的數量,默認和處理器的核心數相同。

這裏寫圖片描述

然後打開 python 解釋器給 Celery 提交任務,可以看到註冊之後的函數對象是<@task: cele.add of cele:0x1094a9c10>,在 add 上執行 delay 並將函數參數傳遞給它就可以給提交一個任務,可以看到返回的是一個 AsynResult 對象,可以在這個對象上查詢任務執行狀態,等待任務完成等等操作。

>>> from cele import add
>>> add
<@task: cele.add of cele:0x1094a9c10>
>>> add.delay(1, 2)
<AsyncResult: 2c3a402d-8d0c-4fb8-ae1c-32173113b320>

同時在 Celery worker 那邊可以看到任務執行情況,大致如下,worker-2 接收到一個任務,並執行得到結果 3

這裏寫圖片描述

一個對執行結果進行存儲的示例

如果你希望對任務執行的狀態和結果進行監測,你需要爲 Celery 配置一個後端,和中間人 Broker 一樣,它可以是 RabbitMQ,Redis等等,下面依然使用 Redis 作爲示例。要爲 Celery 配置一個後端,只需要在創建應用的時候進行指定就可以了,然後對程序進行一些修改,讓它延遲 5 秒再執行。

# cele.py
from celery import Celery
import time

app = Celery('cele', broker='redis://localhost:6379', backend='redis://localhost:6379')

@app.task
def add(x, y):
    time.sleep(5)
    return x + y

然後在命令行依次執行以下語句,應該可以得到類似的結果,所以現在就可以查詢任務執行的狀態以及結果了

>>> result = add.delay(1, 2)
>>> result.status
u'PENDING'
>>> result.staus
u'SUCCESS'
>>> result.result
3

對 Celery 進行配置

對 Celery 進行配置的方式有兩種,(1)在程序中,通過創建的應用對象添加配置;(2)對於大量的配置可以寫在單獨的文件中。
例如,可以直接在 app 的 conf 屬性上進行修改,這個 conf 是一個 dict 對象。

app.conf.task_serializer = 'json'

或者,對於多個配置可以使用字典更新的方式進行配置

app.conf.update(
    task_serializer='json',
    accept_content=['json'], 
    result_serializer='json',
    timezone='Europe/Oslo',
    enable_utc=True,
)

同時,也可以通過創建一個單獨的文件,如下

# config.py
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'Europe/Oslo'
enable_utc = True

從文件導入配置有幾種可選的方式,你可以直接提供模塊名進行索引,這裏的名字應該是包含包名的字符串,類似於 ‘package.config’ 之類的。總之需要解釋器能夠根據這個路徑找到對應的模塊。

app.config_from_object('config')

或者直接從 python 模塊中引用

import config
app.config_from_object(config)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章