django-celery

django celery

Celery 4.0支持Django 1.8及更新版本。请将Celery 3.1用于早于Django 1.8的版本。


要在您的Django项目中使用Celery,您必须首先定义Celery库的实例(称为“app”)

如果你有一个现代的Django项目布局,如::

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

那么推荐的方法是创建一个新的proj / proj / celery.py模块来定义Celery实例:

文件: proj/proj/celery.py

from __future__ import absolute_import, unicode_literals
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 app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

然后,您需要在 proj/proj/__init__.py 模块中导入此应用程序。这可以确保在Django启动时加载应用程序,以便@shared_task 装饰器(稍后提到)将使用它:

文件: proj/proj/__init__.py:

from __future__ import absolute_import, unicode_literals

# 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',)

请注意,此示例项目布局适用于较大的项目,对于简单的项目,您可以使用单个包含的模块来定义应用程序和任务,如使用Celery的第一步教程

让我们分解第一个模块中发生的事情,首先我们从未来导入绝对导入,这样我们的 celery.py模块就不会与库冲突:

from __future__ import absolute_import

然后我们设置celery 默认值 DJANGO_SETTINGS_MODULE 命令行程序的环境变量:

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_EAGERbroker_url 设置变为CELERY_BROKER_URL

您可以直接传递设置对象,但使用字符串更好,因为工作人员不必序列化对象。该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 __future__ import absolute_import, unicode_literals
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)

您也可以在以下网址找到Django示例项目的完整源代码 https://github.com/celery/celery/tree/master/examples/django/

相对导入

您必须在导入任务模块方面保持一致。举例来说,如果你有project.appINSTALLED_APPS,则还必须导入任务或其他任务的名字不能相同。


扩展

django-celery-results 使用Django ORM / Cache作为结果后端

django-celery-results扩展使用任一Django的ORM,或Django的缓存框架提供结果后端

要在项目中使用它,您需要按照以下步骤操作:

  1. 安装django-celery-results库:

$ pip install django-celery-results

  1. 添加django_celery_results到INSTALLED_APPS您的Django项目中settings.py:
INSTALLED_APPS = (
    ...,
    'django_celery_results',
)

请注意,模块名称中没有短划线,只有下划线。

  1. 通过执行数据库迁移来创建Celery数据库表:
$ python manage.py migrate django_celery_results
  1. 配置Celery以使用django-celery-results后端。

假设您正在使用Django settings.py来配置Celery,请添加以下设置:

CELERY_RESULT_BACKEND = 'django-db'

对于缓存后端,您可以使用:

CELERY_RESULT_BACKEND = 'django-cache'

启动工作进程

在生产环境中,您需要在后台运行worker作为守护程序 - 请参阅Daemonization - 但是对于测试和开发,能够通过使用celery worker manage命令启动工作程序实例很有用 ,就像您使用Django的 manage.py runserver

$ celery -A proj worker -l info

有关可用命令行选项的完整列表,请使用help命令:

$ celery help
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值