Celery中文文档

# 在Django中使用Celery

# 在Django中使用Celery

Note:

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

Note:

Celery 5.0.x 支持Django 1.11以及更新版的Django,如果低于1.11 请使用Celery 4.4.x。

要在Django项目中使用Celery,你需要首先定义一个Celery 库(称作"app")

如果你的Django项目目录结构如下:

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

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

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 模块中导入这个app。这可以确保Django启动时app可以被加载,以便 @shared_task 装饰器可以使用它:

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

需要注意的是,这种结构适合大型项目,对于小型项目你可以在一个模块中定义app和tasks,就像Celery起步中的示例那样。

让我们分解一下发生了什么,首先我们给celery命令行程序设置了DJANGO_SETTINGS_MODULEopen in new window环境变量的默认值:

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_EAGERA,broker_url变为CELERY_BROKER_URL。这同样适用于workers配置,比如worker_concurrency变为CELERY_WORKER_CONCURRENCY。

比如,一个Django项目配置文件可能包括:

settings.py

...

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

你也可以将设置作为对象传递,不过更推荐string,这样的话worker可以免去序列化对象的步骤。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示例是一个dumps自身请求的任务。这是Celery3.1引入的新的任务选项bind=True,它可以更简单的引用当前任务实例。

# 使用 @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()

完整的示例代码:https://github.com/celery/celery/tree/master/examples/django/open in new window

# 扩展

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

django-celery-resultsopen in new window扩展使用Django ORM或Django缓存框架提供结果后端。

按照以下步骤使用:

  1. 安装django-celery-resultsopen in new window库:

    $ pip install django-celery-results
    
  2. 在Django项目的settings.py文件中将django_celery_results添加到INSTALLED_APPS中。

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

    注意模块名中只有下划线,没有破折号

  3. 创建Celery数据库表

    $ python manage.py migrate django_celery_results
    
  4. 配置Celery使用django-celery-resultsopen in new window后端。

    假设你使用Django的settings.py配置Celery,添加以下设置:

    CELERY_RESULT_BACKEND = 'django-db'
    

    对于cache后端:

    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',
        }
    }
    

    对于附加的配置选项,参考任务结果后端设置

# django-celery-beat - Database-backed Periodic Tasks with Admin interface

查看自定义调度器类获取更多信息。

# 启动workers进程

生产环境中你可能需要将worker作为守护进程在后台运行,查看Daemonization。但对于测试和开发环境来说,使用celery worker命令启动worker实例更加有用,就像使用manage.py runserver启动Django服务器一样:

$ celery -A proj worker -l INFO

完整的命令行选项列表,可以使用帮助命令:

$ celery help

# 接下来怎么做

如果想要了解更多,应该继续学习下一步教程,然后你可以学习用户指南。

相关内容推荐

张耳文言文翻译机灵猴社会风俗个人潜能公司报销单模板综治证明模板谜英语一分钟鼓掌游戏弥补不足回归自由谜英语初心依然第八品潼关译文沁园春雪课文革命党是什么意思荀子是哪里人神经内科问诊谜语用英语怎么说拒绝信伙伴合作全员经营华北治安军八月缩写英文兔儿山在哪里权力平衡打姐姐屁股护理实习生座谈会长津湖观后感600字与花有关的谚语西游记梗概50字带云的四字词语女士专用的东西徂怎么读音云仙乡妖怎么读抽屉怎么写结婚请柬微信超过英语短语自警自省节能减排宣传语大学生返乡高科技英语难忘的一次劳动花海文案沙基惨案纪念碑余姚博物馆节能低碳内容作文怎么才能写好公文写作标题帽子怎么写报价格式上墙制度实习总结300字青天白日旗飞扬丢失的英语怎么读人员选拔加强值班值守姗姗来迟的近义词二加两笔是什么字龙卷风歌词周杰伦成长趣事幼儿大班郎诵主题教育心得通学生我的大脑歌唱祖国歌曲歌词爱护公物的内容珍惜幸福不足为据的拼音咎由自取的拼音这样的战士艾青现代诗高邮的咸鸭蛋课文均匀的近义词金刚咒怎么念青春无限好吴王靠住歌词拼音字母分类披可以组什么词俯望田五为难地什么乌骓怎么读革命先烈图片现金流分析暑假感悟他真了不起沧海在哪礼轻人意重政府首脑合同违约怎么起诉高考升学宴邀请函该同志思想上当字三十二应兵马俑手抄报特别想念你大连话方言段子拉卜楞寺怎么读后得分公证员助理欲犹未尽强化人才队伍建设夏天爬山深入剖析蚂蚁和螳螂的故事阅读计划卡七律长征朗读科学童话有哪些美特斯邦威广告词榴怎么读贷款理由年少有为的例子和韩信有关的成语天坛讲解语音尘世沧桑泪相思团课思想汇报教学反思万能简短工作愿景怎么写哨哆哩是什么意思很欣慰是什么意思高数极限知识点环境与健康手抄报质保期的法律规定黄山石罗树庚工作业绩简述庐山大口瀑布水政囫囵吞枣意思暴力学生南安毕业送给老师的祝福语主要负责人任命书动漫女孩被打屁股多多益善文言文序号层级黄梁梦明月几时有拼音版小熊抱抱斗争精神不够复活读书笔记摘抄远离焦虑时代的英雄岳阳楼记第四段始祖伏羲芝组词专职武装干部开展安全检查书香校园建设方案优秀家长发言稿3分钟湿漉漉的同情韩浩天志愿服务品牌收获成长欲犹未尽名不虚传的近义词神舟十二号航天员名单军人的样子无组织无纪律夏日趣事川煤六建德能勤绩廉个人工作总结要怎么读啤酒节活动策划圣罗马诺之战万能小组均匀的近义词这才是少年应有的模样作文包饺子看图写话一年级映读音绒花制作教程安安稳稳的近义词交通事故的英语党的工作作风司法鉴定学新时代文明实践站简介创意功夫吉安市审计局巾怎么组词行业文化勊怎么读饭店好评校本研修报告心中的心中国长城最新消息农村公路管理条例打火机英语怎么读杜甫三吏三别原文宿舍铭佩韦信号学习虾组词前英语意识形态宣传装修材料采购合同为荷而来

站外内容推荐
慈喀SEO百科 | SEO学堂 | 德赛环球网 | seo优化 | 网站优化 | SEO工具 | 关键词排名 | 高端网站建设 | 天津万源聚 | 蜂巢动画 | 优化网站排名 | 天津万源聚 | 耗材资讯 | 百度关键词排名优化 | 虚拟主机 | 金凯德工作室 | 网站SEO优化 | seo优化公司 | 素材网站 | 百度关键词排名优化 | seo优化公司