celery筆記四之在Django中使用celery

2023-06-15 21:00:38

本文首發於公眾號:Hunter後端
原文連結:celery筆記四之在Django中使用celery

這一篇筆記介紹一下如何在 Django 系統中使用 celery。

如果是想純粹使用 celery,這一篇筆記可以略過。

本篇筆記目錄如下:

  1. 檔案設定
  2. task 定義
  3. 執行 worker

1、檔案設定

我們這裡使用前面的建立的 hunter Django 系統。

我們需要在 settings.py 所在的資料夾下設定如下幾個檔案:

hunter/hunter/
        /__init__.py
        /celery.py
        /settings.py

其中,celery.py 檔案是我們需要新建的,其他的兩個我們需要新增一點設定項。

以下是 celery.py 檔案內容:

# hunter/hunter/celery.py
import os
from celery import Celery

# 為 celery 程式設定預設的 Django 設定
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hunter.settings')

app = Celery('hunter')

# 表示從 Django 的設定中載入 celery 的設定,namespace='CELERY' 表示 celery 的設定必須是以 'CELERY' 為字首
app.config_from_object('django.conf:settings', namespace='CELERY')

app.conf.update(
    task_ignore_result=True
)

# 我們需要設定的定時任務 或者 延時任務都可以在對應的 application 下定義,task 的定義我們在下面介紹
# 然後通過下面的命令自動發現對應的任務
# 比如想要在 blog 下設定一個延時任務,可以建立 blog/tasks.py,然後 celery 就可以自己發現對應的任務
app.autodiscover_tasks()

在 Django 的 celery.py 裡,不一樣的是,os.environ.setdefault() 函數設定了一個 Django 的設定

對 Celery() 範例化的時候,用到的是 Django 的系統名稱 hunter

而這裡使用到的 config_from_object() 用到的值是 'django.conf:settings',namespace 的值是 'CELERY',表示在 settings.py 中所有 CELERY 開頭的值都可以被捕捉到並作為 celery 的設定項,這個我們等下介紹。

最後面有一個 app.autodiscover_tasks() 表示Django 系統將會自動獲取 Django 系統下各個 application 的 tasks.py 的 task。

以上就是一個最基本的使用模板。

settings.py

在 settings.py 中的設定如下:

CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = "Asia/Shanghai"
CELERY_BROKER_URL = "redis://localhost/0"
CELERY_RESULT_BACKEND = "redis://localhost/1"

其中,所有的關於 celery 的設定都需要加上 CELERY_ 的字首,引數值的定義和之前 celeryconfig.py 中的定義方式是一致的。

還有很多其他的設定項對應值,詳見下面的連結:celery設定項

除此之外,為了確保 celery 的 app 在 Django 執行的時候被載入,我們還需要在 hunter/hunter/init.py 中引入 celery_app。

# hunter/hunter/__init__.py
from .celery import app as celery_app

__all__ = ('celery_app',)

這樣,每個 application 下的 tasks.py 中被 @shared_task 修飾的延時或定時任務就可以使用了。

2、task 定義

假設我們還是沿用之前的 application,命名為 blog,我們在這個資料夾下建立一個 tasks.py,內容如下:

# blog/tasks.py
from celery import shared_task

@shared_task
def test_add(x, y):
    return x + y

在 Django 的 tasks 裡我們會把 task 都寫在可重複使用的 app 下,比如 blog,但是這些 app 不能依賴於專案本身,所以不能直接引入這些app範例

@shared_task 裝飾器可以讓你在不需要任何具體的 app 範例的情況下建立 task

以上是官方檔案給出的一段介紹,u1s1,我不太理解這段話的含義,但是我們照做就行了,就是在 Django 的 task 中,我們使用 @shared_task 來修飾那些 task 即可。

就此,我們將 celery 融入 Django 的操作就完成啦!

3、執行 worker

我們還是需要單獨將 worker 執行起來才可以呼叫延時任務

我們在 Django 系統的根目錄下,也就是 hunter/ 下,執行:

celery -A hunter worker -l INFO

然後新開一個 shell,在 Django 系統的根目錄下進入 Django 的 shell,也就是使用 python3 manage.py shell,然後呼叫 task:

from blog.tasks import test_add

test_add.delay(1, 2)

關於 celery 與 Django 的融合,還有一些其他操作,比如將 task 執行的 result 寫入 Django 的表,使用 Django 的表來設定定義任務等,這個我們後面再單開筆記來詳細介紹。

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