0、目的

在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务。
在这种情况下,使用celery就是一个很好的选择。
 
celery是一个异步任务队列/基于分布式消息传递的作业队列。
Celery通过消息(message)进行通信,使用代理(broker)在客户端和工作执行者之间进行交互。
当开始一个任务时,客户端发送消息到队列并由代理将其发往响应的工作执行者处。
 
准备使用redis作为消息代理(broker),Django数据库作为结果存储(ResultStore)。
 

1、安装

redis:
windows:
linux:
yum install redis-server
PS:需要在cmd中运行,不能再powercmd。很奇怪。
pip install celery
pip install celery-with-redis
pip install django-celery
 

2、django代码(whthas_home为project,portal为app)

修改代码,whthas_home/__init__.py
  1. 1 from __future__ import absolute_import
  2. 2
  3. 3 from .celery import app as celery_app

修改代码,whthas_home/setting.py

  1. 1 # Celery settings
  2. 2 import djcelery
  3. 3 djcelery.setup_loader()
  4. 4
  5. 5 BROKER_URL = 'redis://127.0.0.1:6379/0'
  6. 6 CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'##加密方式CELERY_RESULT_BACKEND = 'redis://:密码@127.0.0.1:6379/0'
  7. 7 CELERY_ACCEPT_CONTENT = ['json']
  8. 8 CELERY_TASK_SERIALIZER = 'json'
  9. 9 CELERY_RESULT_SERIALIZER = 'json'
  10. 10 CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
  11. 11 CELERY_TIMEZONE = 'Asia/Shanghai'
  12. 12
  13. 13 # Application definition
  14. 14
  15. 15 INSTALLED_APPS = [
  16. 16 'django.contrib.auth',
  17. 17 'django.contrib.contenttypes',
  18. 18 'django.contrib.sessions',
  19. 19 'django.contrib.messages',
  20. 20 'django.contrib.staticfiles',
  21. 21 'suit',
  22. 22 'django.contrib.admin',
  23. 23 'DjangoUeditor',
  24. 24 'portal',
  25. 25 'djcelery',
  26. 26 ]

增加文件, whthas_home/celery.py

  1. 1 from __future__ import absolute_import
  2. 2
  3. 3 import os
  4. 4 from celery import Celery
  5. 5 from django.conf import settings
  6. 6
  7. 7 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'whthas_home.settings')
  8. 8
  9. 9 app = Celery('portal')
  10. 10
  11. 11 app.config_from_object('django.conf:settings')
  12. 12 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  13. 13
  14. 14
  15. 15 @app.task(bind=True)
  16. 16 def debug_task(self):
  17. 17 print('Request: {0!r}'.format(self.request))
增加文件,portal/tasks.py
  1. 1 from celery import task
  2. 2 from time import sleep
  3. 3
  4. 4
  5. 5 @task()
  6. 6 def Task_A(message):
  7. 7 Task_A.update_state(state='PROGRESS', meta={'progress': 0})
  8. 8 sleep(10)
  9. 9 Task_A.update_state(state='PROGRESS', meta={'progress': 30})
  10. 10 sleep(10)
  11. 11 return message
  12. 12
  13. 13
  14. 14 def get_task_status(task_id):
  15. 15 task = Task_A.AsyncResult(task_id)
  16. 16
  17. 17 status = task.state
  18. 18 progress = 0
  19. 19
  20. 20 if status == u'SUCCESS':
  21. 21 progress = 100
  22. 22 elif status == u'FAILURE':
  23. 23 progress = 0
  24. 24 elif status == 'PROGRESS':
  25. 25 progress = task.info['progress']
  26. 26
  27. 27 return {'status': status, 'progress': progress}

3、测试

启动broker:python manage.py celeryd -l info
进入shell:python manage.py shell,测试程序是否正常。 
  1. >>> from portal.tasks import *
  2. >>> t = TaskA.delay("heel2")
  3. >>> get_task_status(t.id)
  4. {'status': u'PROGRESS', 'progress': 0}
  5. >>> get_task_status(t.id)
  6. {'status': u'PROGRESS', 'progress': 0}
  7. >>> get_task_status(t.id)
  8. {'status': u'PROGRESS', 'progress': 30}
  9. >>> get_task_status(t.id)
  10. {'status': u'PROGRESS', 'progress': 30}
  11. >>> get_task_status(t.id)
  12. {'status': u'SUCCESS', 'progress': 100}
  13. >>>

同时broker侧能看到:

  1. [2017-04-21 16:38:47,023: INFO/MainProcess] Received task: portal.tasks.Task_A[da948495-c64b-4ff9-882b-876721cd5017]
  2. [2017-04-21 16:39:07,035: INFO/MainProcess] Task portal.tasks.Task_A[da948495-c64b-4ff9-882b-876721cd5017] succeeded in 20.0099999905s: heel

表示代码能正常运行。

使用redis-client看到任务状态:
  1. 127.0.0.1:6379> get "celery-task-meta-da948495-c64b-4ff9-882b-876721cd5017"
  2. "{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": \"heel\", \"children\": []}"

相关redis命令:keys *

4、django后台定义任务

进入后台
 设置任务

5、执行任务

启动broker:python manage.py celeryd -l info

因为这里是个定时任务,所以还需要启动心跳 :python manage.py celery beat  
broker侧能看到: 
  1. [2017-04-21 16:56:33,216: INFO/MainProcess] Received task: portal.tasks.Task_A[d8a26977-8413-4bf0-b518-b53052af4cee]
  2. [2017-04-21 16:56:53,211: INFO/MainProcess] Received task: portal.tasks.Task_A[00f1cab7-eb56-4cc3-9979-a8a68aaaf2de]
  3. [2017-04-21 16:56:53,220: INFO/MainProcess] Task portal.tasks.Task_A[d8a26977-8413-4bf0-b518-b53052af4cee] succeeded in 20.003000021s: heel2
  4. [2017-04-21 16:57:13,211: INFO/MainProcess] Received task: portal.tasks.Task_A[aa652612-8525-4110-94ea-9010085ec20b]
  5. [2017-04-21 16:57:13,223: INFO/MainProcess] Task portal.tasks.Task_A[00f1cab7-eb56-4cc3-9979-a8a68aaaf2de] succeeded in 20.0080001354s: heel2
  6. [2017-04-21 16:57:33,213: INFO/MainProcess] Received task: portal.tasks.Task_A[9876890e-6a71-4501-bdae-775492ebae88]
  7. [2017-04-21 16:57:33,219: INFO/MainProcess] Task portal.tasks.Task_A[aa652612-8525-4110-94ea-9010085ec20b] succeeded in 20.0050001144s: heel2
  8. [2017-04-21 16:57:53,211: INFO/MainProcess] Received task: portal.tasks.Task_A[c12fcffc-3910-4a22-93b3-0df740910728]
  9. [2017-04-21 16:57:53,221: INFO/MainProcess] Task portal.tasks.Task_A[9876890e-6a71-4501-bdae-775492ebae88] succeeded in 20.0069999695s: heel2
  10. [2017-04-21 16:58:13,211: INFO/MainProcess] Received task: portal.tasks.Task_A[ccfad575-c0b4-48f5-9385-85ff5dac76fc]
  11. [2017-04-21 16:58:13,217: INFO/MainProcess] Task portal.tasks.Task_A[c12fcffc-3910-4a22-93b3-0df740910728] succeeded in 20.003000021s: heel2
  12. [2017-04-21 16:58:33,211: INFO/MainProcess] Received task: portal.tasks.Task_A[0d6f77a6-a29c-4ead-9428-e3e758c754e1]
  13. [2017-04-21 16:58:33,221: INFO/MainProcess] Task portal.tasks.Task_A[ccfad575-c0b4-48f5-9385-85ff5dac76fc] succeeded in 20.007999897s: heel2
  14. [2017-04-21 16:58:53,211: INFO/MainProcess] Received task: portal.tasks.Task_A[34b2b3a0-771c-4a28-94a1-92e25763fae1]
  15. [2017-04-21 16:58:53,217: INFO/MainProcess] Task portal.tasks.Task_A[0d6f77a6-a29c-4ead-9428-e3e758c754e1] succeeded in 20.0039999485s: heel2
  16. [2017-04-21 16:59:13,211: INFO/MainProcess] Received task: portal.tasks.Task_A[d4be920f-376a-46a2-9edd-095234d29ef2]
  17. [2017-04-21 16:59:13,217: INFO/MainProcess] Task portal.tasks.Task_A[34b2b3a0-771c-4a28-94a1-92e25763fae1] succeeded in 20.0039999485s: heel2
可见:设置定时任务成功。
 
参考资料:
1、https://gist.github.com/tyrchen/1436486,Django-celery + Redis notes
2、http://www.cnblogs.com/aguncn/p/4947092.html,django celery redis简单测试
3、https://my.oschina.net/kinegratii/blog/292395?fromerr=2lvw3H0L,djcelery入门:实现运行定时任务

django+celery+redis实现运行定时任务的更多相关文章

  1. django celery redis 定时任务

    0.目的 在开发项目中,经常有一些操作时间比较长(生产环境中超过了nginx的timeout时间),或者是间隔一段时间就要执行的任务. 在这种情况下,使用celery就是一个很好的选择.   cele ...

  2. Django + Celery 实现动态配置定时任务

    哈喽,今天给大家分享一篇Django+Celery实现动态配置定时任务,因为最近也是无意间看到一位大佬关于这块的文章,然后自己觉得不错,也想学习写一下,然后最终实现功能是在前端页面统一管理计划任务,大 ...

  3. django+celery+redis环境搭建

    初次尝试搭建django+celery+redis环境,记录下来,慢慢学习~ 1.安装apache 下载httpd-2.0.63.tar.gz,解压tar zxvf httpd-2.0.63.tar. ...

  4. 06: django+celery+redis

    目录: 1.1 Celery介绍 1.2 celery 组件 1.3 安装相关包 与 管理命令 1.4 celery与Django执行异步任务 1.5 在django中使用计划任务功能 1.1 Cel ...

  5. 项目部署Django+celery+redis

    celery介绍 1.celery应用举例 1.Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,   如果你的业务场景中需要用到异步任务,就可以 ...

  6. python用Django+Celery+Redis 监视程序(一)

    C盘创建一个目录就叫DjangoDemo,然后开始在该目录下操作. 1.新建Django工程与应用 运行pip install django 安装django 这里我们建一个名为demo的项目和hom ...

  7. Django+Celery+redis kombu.exceptions.EncodeError:Object of type is not JSON serializable报错

    在本文中例子中遇到问题的各种开发版本如下: Python3.6.8 Django==2.2 celery==4.4.0 kombu==4.6.7 redis==3.3.0 大概的报错如下截图: 是在开 ...

  8. Django + celery +redis使用

    1.安装包 pip install celery pip install django-celery pip install pymysql 2.创建一个django项目 - proj/ - proj ...

  9. django+celery+redis应用

    一.celery介绍 1.应用场景 a. Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用ce ...

随机推荐

  1. bzoj1053 搜索

    2013-11-16 17:43 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1053 因为使pi(prime[i])<20亿的i不 ...

  2. 【MT8382/8121】使用绝对路径编译模块会导致recourse_overlay无法应用的问题

    之前为了方便mm模块编译,写了个脚本,实现了在任意模块其子目录下执行脚本即可编译的功能. 其实原理就是一层一层目录地往上寻找Android.mk文件,找到存放Android.mk目录后,就把该目录当作 ...

  3. 如何在本机搭建SVN服务器【转】

    转自:http://www.cnblogs.com/loveclumsybaby/archive/2012/08/21/2649353.html 目的:在没有正式的SVN服务器的情况下,完成代码的本地 ...

  4. Mac-sublime text 3破解版

    在史蒂芬周下载破解版 安装package control import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f ...

  5. EasyUI的tree展开所有的节点或者根据特殊的条件控制展示指定的节点

    展示tree下的所有节点$(function(){ $('#t_funinfo_tree').tree({ checkbox: true, url:"<%=basePath %> ...

  6. [ Python - 6 ] 正则表达式实现计算器功能

    要求:禁止使用eval函数.参考网上代码如下: #!_*_coding:utf-8_*_ """用户输入计算表达式,显示计算结果""" im ...

  7. poj 2826(好坑,线段相交问题)

    An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11576   Accepted: 176 ...

  8. 山东省第六届省赛 H题:Square Number

    Description In mathematics, a square number is an integer that is the square of an integer. In other ...

  9. keyPoints的相关函数

    cout<<"坐标:"<<keypoints1[i].pt; cout<<",邻域直径:"<<keypoints ...

  10. CF GukiZ hates Boxes 【二分+贪心】

    Professor GukiZ is concerned about making his way to school, because massive piles of boxes are bloc ...