Django中使用celery

Django中使用celery

celery实例创建

注意

以前版本的Celery需要一个单独的库才能与Django一起使用,但是从3.1开始,情况不再如此。现成的支持Django,因此本文档仅包含集成Celery和Django的基本方法。您将使用与非Django用户相同的API,因此建议您先阅读“ 使用Celery第一步”教程,然后再返回本教程。当您有可用的示例时,可以继续阅读“ 下一步”指南。

注意

Celery 4.0支持Django 1.8和更高版本。对于Django 1.8之前的版本,请使用Celery 3.1。

要将Celery与Django项目一起使用,您必须首先定义Celery库的实例(称为“应用”)

如果您拥有现代的Django项目布局,例如:

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

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

文件:proj/proj/celery.py

# 导入future 模块,让我们的celery.py 不会与其他类库产生冲突。
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# 在celery应用中加载Django的配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

# 实例化celery对象
app = Celery(
    'proj',
    # 使用redis的1号库作为消息列队
    broker="redis://127.0.0.1:6379/1",
    # 使用redis的2号库存储任务结果
    backend="redis://127.0.0.1:6379/2",
)

# 把celery的配置放到django的settings配置文件中
# 此处的参数你可以传递对象,但是建议字符串,这样使用windows 或execv 的时候,无需序列化对象。
# - namespace='CELERY' 表示所有celery相关的配置参数需要添加`CELERY_` 前缀
app.config_from_object('django.conf:settings', namespace='CELERY')

# 这个配置,让celery 自动发现django app 下定义的task 时, django app下的task 文件名 必须为 tasks.py
# 这样就不必在各个模块手动添加到CELERY_IMPORTS参数。lambda 函数会使app在调用的时候能够被自动的发现,并且使你输入的模块不会影响Django的设置对象。
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

# 导入任务,有autodiscover_tasks会自动获取应用中的tasks任务,如果我们需要倒入额外的则需要通过CELERY_IMPORTS来添加
CELERY_IMPORTS = [
    'app01.taskName',
    'app02.taskName'
]

# debug_task 例子是绑定了自己的request请求信息的一个任务函数。
@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

# 这个操作是为了确保在django启动时启动celery
from .celery import app as celery_app

__all__ = ('celery_app',)

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

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

from __future__ import absolute_import

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

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

您不需要此行,但是可以避免始终将设置模块传递到celery程序中。它必须始终在创建应用程序实例之前出现,我们接下来要做的是:

app = Celery('proj')

这是我们的库实例,您可以有很多实例,但是使用Django时可能没有理由。

实例后更新配置的方法:

# 更新配置,配置中间人和结果存储
app.conf.update(
    # 使用redis的库1作为消息队列
    BROKER_URL="redis://127.0.0.1:6379/1",

    # 使用项目数据库存储任务执行结果
    CELERY_RESULT_BACKEND='django-db',
    # 如过想把把结果存在redis的库2中这样配置:
    # CELERY_RESULT_BACKEND = "redis://:123@127.0.0.1:6800/2",
)

我们还将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

您可以直接传递设置对象,但是使用字符串更好,因为那样一来,工作人员就不必序列化该对象。该CELERY_命名空间也是可选的,但建议(以防止重叠与其他Django的设置)。

接下来,可重用应用程序的常见做法是在一个单独的tasks.py模块中定义所有任务,而Celery确实可以自动发现这些模块:

app.autodiscover_tasks()

tasks.py约定的上方,Celery将自动按照惯例从所有已安装的应用程序发现任务:

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

这样,您不必手动将单个模块添加到CELERY_IMPORTS设置中。

最后,该debug_task示例是一个转储其自己的请求信息的任务。这是使用bind=TrueCelery 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
也可以看看

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

相对导入

您必须在导入任务模块的方式上保持一致。例如,如果您在project.appINSTALLED_APPS,则还必须导入任务,否则任务的名称最终将不同。from project.app

请参阅自动命名和相对导入

django-celery-results

使用Django ORM / Cache作为结果后端

所述的django-芹菜-结果扩展使用任一Django的ORM,或Django的缓存框架提供结果后端。

要将其用于您的项目,您需要执行以下步骤:

  1. 安装django-celery-results库:

    $ pip install django-celery-results
    
  2. 添加django_celery_resultsINSTALLED_APPS您的Django项目的中settings.py

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

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

  3. 通过执行数据库迁移来创建Celery数据库表:

    $ python manage.py migrate celery_results
    
  4. 配置Celery以使用django-celery-results后端。

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

    CELERY_RESULT_BACKEND = 'django-db'
    

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

    CELERY_CACHE_BACKEND = 'django-cache'
    

django-celery-beat

具有管理界面的数据库支持的定期任务。

可以在命令行(--scheduler参数)上指定自定义调度程序类 。

默认调度程序是celery.beat.PersistentScheduler,它仅跟踪本地shelve 数据库文件中的最后运行时间。

还有django-celery-beat扩展,可将日程表存储在Django数据库中,并提供一个方便的管理界面来在运行时管理定期任务。

要安装和使用此扩展:

  1. 使用pip安装软件包:

    $ pip install django-celery-beat
    
  2. django_celery_beat模块添加到INSTALLED_APPSDjango项目中settings.py

    INSTALLED_APPS = (
        ...,
        'django_celery_beat',
    )
    

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

  3. 应用Django数据库迁移,以便创建必要的表:

    $ python manage.py migrate
    
  4. 使用调度程序启动芹菜节拍服务django_celery_beat.schedulers:DatabaseScheduler

    $ celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
    

    注意:您也可以直接将其添加为设置选项。

  5. 访问Django-Admin界面以设置一些定期任务。

启动工作进程

在生产环境中,你会想要在后台作为守护程序运行工人-看到系统守护进程 -但对于测试和开发能够通过使用来启动一个工人实例它是有用的 芹菜工人 manage命令,就像你” d使用Django的 manage.py runserver

$ celery -A proj worker -l info

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

$ celery help

Django-celery模块

django-celery是django中的celery集成模块

Django-celery3.3.1,仅当你要使用DJANGO结果后端和管理集成时才需要此项目。

django-celery为Django提供Celery集成;使用Django ORM和缓存后端存储结果,自动发现INSTALLED_APPS中列出的应用程序的任务模块,等等。

使用django-celery

要为您的项目启用django-celery,您需要将djcelery添加到 INSTALLED_APPS

INSTALLED_APPS + =(“ djcelery”,)

然后将以下几行添加到您的settings.py中

import djcelery
djcelery.setup_loader()

除了需要通过manage.py调用程序外,所有操作均与celery在Django中的使用方法相同。

celery中使用命令在django-celery集成中对应如下命令
celerypython manage.py celery
celery workerpython manage.py celery worker
celery beatpython manage.py celery beat
celery ...python manage.py celery ...

另一个主要的区别是,参数配置值存储在Django项目的settings中,而不是在celeryconfig.py中。

安装使用

你可以通过源码安装,或者通过pip命令

$ pip install django-celery

或者通过 easy_install安装,:

$ easy_install django-celery

然后你需要创建一些必要的表格. 如果你产生了一些迁移,使用如下命令

$ python manage.py migrate djcelery
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值