celery筆記二之建立celery專案、配置及幾種載入方式

Hunter發表於2023-05-04
本文首發於公眾號:Hunter後端
原文連結:celery筆記二之建立celery專案、配置及幾種載入方式

接下來我們建立一個 celery 專案,資料夾及目錄如下:

proj/__init__.py
    /celery.py
    /tasks1.py
    /tasks2.py

接下來我們逐個檔案向裡面新增內容。

1、專案檔案內容及介紹

我們建立了一個名為 proj 的資料夾作為我們的專案資料夾,其下有兩個檔案,celery.py 和 tasks.py

celery.py

其中 celery.py 內容為 celery 例項化以及一些基礎配置,檔案內容如下:

from celery import Celery

app = Celery('proj',
             broker='redis://localhost/0',
             backend='redis://localhost/1',
             include=['proj.tasks1', 'proj.tasks2'])

app.conf.update(
    result_expires=60
)

if __name__ == '__main__':
    app.start()

在這裡,我們還是對 celery 進行了例項化的操作,但是在這裡專案名稱改為了 proj,也就是這個檔案的上一級資料夾名稱

broker、backend 還是對應的配置

但是因為對應的任務我們是單獨以檔案的形式引入,所以,在這裡引入的方式是透過 include 的方式來實現的

app.conf.update() 是對 celery 配置的補充,這裡只加了一個引數,表示是對系統對結果的留存時間。

另外幾種配置方式我們放在下面詳講。

接著 app.start() 就是專案的啟動。

tasks.py

在這裡我們將 task 作為兩部分拆解,分別放在兩個檔案下,內容分別如下

#tasks1.py
from .celery import app

@app.task
def add(x, y):
    return x + y
#tasks2.py
from .celery import app

@app.task
def mul(x, y):
    return x * y

啟動服務,在 proj 所在的資料夾,執行下面的命令:

celery -A proj worker -l INFO

執行延時任務

在 proj 同級的資料夾下執行 python3,進入 python 的互動介面:

from proj.tasks1 import add
add.delay(1, 2)

2、celery配置的幾種方式

在上面的 celery 的配置方式,是一部分寫在 celery 的例項化過程中,另一部分是透過 app.conf.update() 的方式寫入

這裡介紹一下,celery 的配置還可以透過類的方式來寫入,或者把所有變數都寫入一個檔案,透過引入檔案的形式來引入變數。

不管是以類的方式還是檔案的形式都會使用到一個方法:config_from_object(),引數為需要引入的變數

類的方式載入配置

下面是一個類的方式引入的示例:

# celery.py
from celery import Celery

app = Celery()
class Config:
    include = ['proj.tasks1', 'proj.tasks2']
    broker_url = 'redis://localhost:6379/0'
    result_backend = 'redis://localhost:6379/1'
    
app.config_from_object(Config)

if __name__ == '__main__':
    app.start()

這裡需要注意的是在 Config 中的 broker_url 和 result_backend 與直接例項化 Celery 時寫入的引數名稱是不一樣的

檔案的形式載入配置

接下來我們在 proj 的資料夾中新建一個檔案 celeryconfig.py,那麼 proj 資料夾下的檔案配置則如下:

proj/__init__.py
    /celery.py
    /celeryconfig.py
    /tasks1.py
    /tasks2.py

配置檔案內容:

# celeryconfig.py
broker_url = 'redis://localhost/0'
result_backend = 'redis://localhost/1'
include = ['proj.tasks1', 'proj.tasks2']

celery 檔案內容:

# celery.py
from celery import Celery
from . import celeryconfig


app = Celery()
app.config_from_object(celeryconfig)

if __name__ == '__main__':
    app.start()

無論是把配置寫入 Config 類中,還是寫入檔案,這裡的思想都是將配置集中處理,在一處管理所有的配置內容。

注意:
在這裡我們引入配置的方式都是 config_from_object(),我們之前還介紹過一個更新配置的方式是 app.conf.update()

這裡要說明的是,只要執行了 config_from_object() 函式,在此之前的變數都會被覆蓋失效,如果我們要新增 celeryconfig 之外的配置,則需要在呼叫 config_from_object() 函式之後呼叫,比如:


app = Celery()

app.conf.update(result_expires=60) # 在 config_from_config() 之前呼叫,會失效

app.config_from_object(celeryconfig)

app.conf.update(result_expires=30)  # 這個配置會生效

還有一種引入配置的方式是在 Django 系統中,將 Celery 相關的變數都寫入 settings.py,然後透過 namespace 的方式引入到 Celery 中進行例項化處理。

這個方式我們在介紹 celery 與 Django 結合的時候再做介紹。

3、一些基本配置

設定時區

比如我們設定北京時間:

app.conf.update(
    enable_utc=False,
    timezone='Asia/Shanghai',
)

broker 和 result_backend 設定

設定 broker 和 result_backend 的地址:

app.conf.update(
    broker_url = 'redis://localhost:6379/0'
    result_backend = 'redis://localhost:6379/1'
)

如果是 broker 和 backend 加密碼的配置,則是如下:

app.conf.update(
    broker_url = 'redis://:123456@localhost:6380/0'
    result_backend = 'redis://:123456@localhost:6380/1'
)

其中,123456 是密碼。

如果是用 docker 啟動一個帶密碼的 redis,命令如下:

docker run -d --name redis_pwd -p6380:6379 redis:latest --requirepass 123456

此外還有一些任務佇列 queue、預設佇列、任務路由配置、定時任務的設定,在後面介紹到的時候再一一介紹。

下一篇筆記將介紹 task 和 task 的呼叫。

如果想獲取更多後端相關文章,可掃碼關注閱讀:
image.png

相關文章