celery 4.0在django 1.8.x以上的简单使用

celery 是基于python实现的一个分布式任务框架。
在celery 3.2.x 以下的版本和celery 4.x 版本涉及到的配置方式以及使用方式有点不同。
文章中的内容是介绍celery 4.0 在django中如何配置,以及简单的运用。
celery 4.x 仅支持django 1.8以上版本。
未来的celery 5.x 以上仅支持python 3.5或者更新的版本。
1:配置应用环境
使用虚拟环境去配置环境

mkvirtualenv celery_demo
pip install django==1.8.10
pip install celery==4.0.2
django-admin start startproject celerydemo #创建django项目
cd ./celery_demo 
python manage.py startapp demo #创建django app  

在完成上述的项目创建后,那么需要的是进行一些配置。
对celery.py的配置
/celery_demo/celery_demo/celery.py

# coding:utf-8
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', 'celerydemo.settings')

app = Celery('celerydemo')

# Using a string here means the worker don'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))

搞好celery.py 文件后,需要在/celery_demo/celery_demo/init.py 进行一些配置

# coding:utf-8
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']

这个配置文件的作用是确保app的 task总会被django的引用和支持。


当完成上述的步骤后,可以尝试下执行celery 程序

celery worker -A celery_demo -l info

当使用上述命令的时候,会看到Error

[2017-01-09 17:31:52,299: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 61] Connection refused.
Trying again in 2.00 seconds...

这个时候得在/celery_demo/celery_demo/settings.py 中配置好CELERY_BROKER_URL 的参数。
我使用的是redis作为broker
配置如下:

#/celery_demo/celery_demo/settings.py
CELERY_BROKER_URL = 'redis://127.0.0.1/2'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'

还需要install redis

pip install redis

这个时候好了,可以执行

celery worker -A celerydemo -l info

会显示celery已经在运行了。
那么可以使用下面的去测试代码或者项目。

python manage.py shell
#在命令行脚本中
from celerydemo.celery import debug_task
debug_task.delay()

会到看终端中出现log

[2017-01-09 17:37:29,279: WARNING/PoolWorker-2] Request: <Context: {u'origin': u'gen78371@youyoudeMacBook-Pro.local', u'args': [], u'chain': None, u'root_id': u'384bb5a3-f041-48e2-a4c6-f19c730f4eb7', u'expires': None, u'is_eager': False, u'correlation_id': u'384bb5a3-f041-48e2-a4c6-f19c730f4eb7', u'chord': None, u'reply_to': u'6254263f-0c98-371e-b58e-3ca94fab880e', u'id': u'384bb5a3-f041-48e2-a4c6-f19c730f4eb7', u'kwargsrepr': u'{}', u'lang': u'py', u'retries': 0, u'task': u'celerydemo.celery.debug_task', u'group': None, u'timelimit': [None, None], u'delivery_info': {u'priority': 0, u'redelivered': None, u'routing_key': u'celery', u'exchange': u''}, u'hostname': u'celery@youyoudeMacBook-Pro.local', 'called_directly': False, u'parent_id': None, u'argsrepr': u'()', u'errbacks': None, u'callbacks': None, u'kwargs': {}, u'eta': None, '_protected': 1}>
[2017-01-09 17:37:29,280: INFO/PoolWorker-2] Task celerydemo.celery.debug_task[384bb5a3-f041-48e2-a4c6-f19c730f4eb7] succeeded in 0.00210009199509s: None

那么大体上celery 4.x 已经在django中配置好,甚至可以执行部分的异步任务。


下面的是拓展
1:如何处理定时任务
a:

pip install django-celery-beat

b: 添加 django_celery_beat 模块到 项目的settings.py 的INSTALLED_APPS 中

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

c:应用模块中的表单到数据库中

python manage.py migrate

d:使用django 的任务心跳调度器

celery beat -A celerydemo -l info

e:配置定时任务

python manage.py runserver 
# :8080/admin/django_celery_beat/ 中配置

2:定时任务的返回结果处理
以往的数据中,返回的结果是可以不需要或者忽略的。
a:配置上面很简单

pip install django-celery-results

b:添加 django_celery_results 到 INSTALLED_APPS
c:创建应用django_celery_results 所需的表单

python manage.py migrate django_celery_results

d:在配置文件中使用 django_celery_results 作为celery的使用

#settings.py
CELERY_RESULT_BACKEND = 'django-db'
or 
CELERY_RESULT_BACKEND = 'django-cache'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容