首頁 > 軟體

python3.8+django2+celery5.2.7環境準備(python測試開發django)

2022-07-19 22:02:18

前言

以前版本的 Celery 需要一個單獨的庫(django-celery)來與 Django 一起工作,但從 3.1 開始不再是這種情況。
現在支援開箱即用的 Django,因此本檔案僅包含整合 Celery 和 Django 的基本方法.
celery5.x 不支援windows平臺了。Celery 5.0.x 支援 Django 1.11 LTS 或更新版本。

版本要求

Celery 5.2 版執行於

  • Python❨3.7、3.8、3.9、3.10❩
  • PyPy3.7、3.8 ❨7.3.7❩

Celery 4.x 是支援 Python 2.7 的最後一個版本,
Celery 5.x 需要 Python 3.6 或更高版本。
Celery 5.1.x 還需要 Python 3.6 或更高版本。
Celery 5.2.x 需要 Python 3.7 或更新版本。

如果您執行的是舊版本的 Python,則需要執行舊版本的 Celery:

Python 2.7 或 Python 3.5:Celery 系列 4.4 或更早版本。
Python 2.6:Celery 系列 3.1 或更早版本。
Python 2.5:Celery 系列 3.0 或更早版本。
Python 2.4 是 Celery 系列 2.2 或更早版本。

Celery 是一個資金很少的專案,所以不支援 Microsoft Windows。請不要開啟與該平臺相關的任何問題。

環境準備

執行系統:linux(centos/debian/ubuntu),不支援windows
Python版本:3.8.5
Django : 2.2.2
celery: 5.2.7

使用pip安裝celery5.2.7版本

pip install celery==5.2.7

Django中使用Celery

要在 Django 專案中使用 Celery,您必須首先定義 Celery 庫的範例(稱為“應用程式”)
如果你有一個現代的 Django 專案佈局,比如:

- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py

那麼推薦的方法是建立一個新的proj/proj/celery.py模組來定義 Celery 範例:

proj/proj/celery.py 檔案內容

import os
from celery import Celery
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django apps.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

然後你需要在你的proj/proj/init.py 模組中匯入這個應用程式。這可以確保在 Django 啟動時載入應用程式,以便@shared_task裝飾器(稍後提到)將使用它:

proj/proj/__init__.py內容:

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ('celery_app',)

請注意,此範例專案佈局適用於較大的專案,對於簡單的專案,您可以使用單個包含的模組來定義應用程式和任務

讓我們分解第一個模組中發生的事情,首先,我們設定預設值DJANGO_SETTINGS_MODULEcelery命令列程式的環境變數:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

您不需要此行,但它使您不必總是將設定模組傳遞給celery程式。它必須始終在建立應用程式範例之前出現,就像我們接下來要做的那樣:

app = Celery('proj')

這是我們的庫範例,您可以有很多範例,但在使用 Django 時可能沒有理由這樣做。

我們還將 Django 設定模組新增為 Celery 的設定源。這意味著您不必使用多個組態檔,而是直接從 Django 設定中設定 Celery;但如果需要,您也可以將它們分開。

app.config_from_object('django.conf:settings', namespace='CELERY')

大寫名稱空間意味著所有 Celery 設定選項 必須以大寫而不是小寫指定,並且以 開頭 CELERY_,例如task_always_eager設定變為CELERY_TASK_ALWAYS_EAGER,broker_url 設定變為CELERY_BROKER_URL。這也適用於工作人員設定,例如,worker_concurrency 設定變為CELERY_WORKER_CONCURRENCY.

例如,一個 Django 專案的組態檔可能包括:

...
# Celery Configuration Options
CELERY_TIMEZONE = "Australia/Tasmania"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60

您可以直接傳遞設定物件,但使用字串更好,因為這樣工作人員不必序列化物件。CELERY_名稱空間也是可選的,但建議使用(以防止與其他 Django 設定重疊)。

接下來,可重用應用程式的一個常見做法是在單獨的tasks.py模組中定義所有任務,Celery 確實有一種方法可以自動發現這些模組:

app.autodiscover_tasks()

使用上面的程式碼,Celery 將自動從您安裝的所有應用程式中發現任務,遵循tasks.py約定:

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

這樣您就不必手動將各個模組新增到CELERY_IMPORTS設定中。

最後,該debug_task範例是一個轉儲自己的請求資訊的任務。這是使用bind=True Celery 3.1 中引入的新任務選項來輕鬆參照當前任務範例。

使用 @shared_task 裝飾器

您編寫的任務可能會存在於可重用的應用程式中,而可重用的應用程式不能依賴於專案本身,因此您也不能直接匯入您的應用程式範例。

裝飾器允許您在@shared_task沒有任何具體應用範例的情況下建立任務:

demoapp/tasks.py:

# Create your tasks here
from demoapp.models import Widget
from celery import shared_task
@shared_task
def add(x, y):
    return x + y
@shared_task
def mul(x, y):
    return x * y
@shared_task
def xsum(numbers):
    return sum(numbers)
@shared_task
def count_widgets():
    return Widget.objects.count()
@shared_task
def rename_widget(widget_id, name):
    w = Widget.objects.get(id=widget_id)
    w.name = name
    w.save()

您可以在以下位置找到 Django 範例專案的完整原始碼: https ://github.com/celery/celery/tree/master/examples/django/

django-celery-results 儲存結果

django-celery-results- 使用 Django ORM/Cache 作為結果後端
django-celery-results擴充套件使用Django ORM 或 Django Cache 框架提供結果後端。

要將其用於您的專案,您需要執行以下步驟:
1.安裝django-celery-results庫:

 pip install django-celery-results

2.新增django_celery_results到INSTALLED_APPS您的 Django 專案中settings.py:

INSTALLED_APPS = (
    ...,
    'django_celery_results',
)

請注意,模組名稱中沒有破折號,只有下劃線。
3.通過執行資料庫遷移來建立 Celery 資料庫表:

 python manage.py migrate django_celery_results

4.設定 Celery 以使用django-celery-results後端。
假設您使用 Djangosettings.py來設定 Celery,新增以下設定

CELERY_RESULT_BACKEND = 'django-db'

對於快取後端,您可以使用:

CELERY_CACHE_BACKEND = 'django-cache'

我們也可以使用 django 的 CACHES 設定中定義的快取。

# celery setting.
CELERY_CACHE_BACKEND = 'default'

# django setting.
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
    }
}

有關其他設定選項,請檢視 任務結果後端https://docs.celeryq.dev/en/stable/userguide/configuration.html設定參考。

django-celery-beat 定時任務

django-celery-beat- 具有管理介面的資料庫支援的定期任務。 詳細資料參考https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html

啟動工作程序

在生產環境中,您將希望在後臺將工作程式作為守護程式執行 - 請參閱守護程式-但對於測試和開發,能夠使用 celery worker manage 命令啟動工作程式範例很有用,就像您一樣d 使用 Django 的 manage.py runserver:

celery -A proj worker -l INFO

有關可用命令列選項的完整列表,請使用幫助命令:

 celery help

到此這篇關於python3.8+django2+celery5.2.7環境準備的文章就介紹到這了,更多相關python3.8+django2+celery5.2.7環境內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com