非同步任務(Celery)

Celery 是一個任務佇列,可以執行後臺或預定的作業,並與 Django 很好地整合。Celery 需要一些稱為訊息代理的東西來將訊息從呼叫傳遞給 worker。這個訊息代理可以是 redis,rabbitmq 甚至是 Django ORM / db,儘管這不是推薦的方法。

在開始使用該示例之前,你必須配置芹菜。要配置 celery,請在主應用程式中建立一個 celery_config.py 檔案,與 settings.py 檔案並行。

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

# broker url 
BROKER_URL = 'redis://localhost:6379/0'

# Indicate Celery to use the default Django settings module
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

app = Celery('config')
app.config_from_object('django.conf:settings')
# if you do not need to keep track of results, this can be turned off
app.conf.update(
    CELERY_RESULT_BACKEND=BROKER_URL,
)

# This line will tell Celery to autodiscover all your tasks.py that are in your app folders
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

並在主應用程式的 __init__.py 檔案匯入芹菜應用程式。像這樣

# -*- coding: utf-8 -*- 
# Not required for Python 3. 
from __future__ import absolute_import

from .celery_config import app as celery_app  # noqa

要執行 celery worker,請在 manage.py 所在的級別使用此命令。

# pros is your django project, 
celery -A proj worker -l info