设为首页 收藏本站
查看: 1236|回复: 0

[经验分享] Django Celery Redis 异步执行任务demo实例

[复制链接]
发表于 2017-12-21 12:36:08 | 显示全部楼层 |阅读模式
一、windows中安装redis
  安装过程见 《在windows x64上部署使用Redis》

二、环境准备
  requirements.txt
  

Django==1.10.5  
celery==3.1.23
  
redis==2.10.5
  

  注意,celery 4.x 以上不支持windows
  

pip install -r requirements.txt  


三、创建Django项目celery_proj,创建APP:celery_demo
  

>>django-admin startproject celery_proj  

>>cd celery_proj  

>>django-admin startapp celery_demo  


四、添加celery相关配置信息
  1.在celery_proj/celery_proj目录下,添加如下 celery.py 文件
  

#!/usr/bin/env python  
#
-*- coding: utf-8 -*-  

  
from __future__ import absolute_import
  
import os
  
from celery import Celery
  
from django.conf import settings
  

  
# set the default Django settings module for the 'celery_proj' program.
  
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_proj.settings')
  
app = Celery('celery_proj')
  

  
# Using a string here means the worker will not have to
  
# pickle the object when using Windows.
  
app.config_from_object('django.conf:settings')
  
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  

  

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

  2.在celery_proj/celery_proj/__init__.py 中添加:
  

from .celery import app as celery_app  

  3.在项目配置文件中,如celery_proj/celery_proj/settings.py 中添加:
  

# CELERY STUFF  
BROKER_URL = 'redis://localhost:6379'
  
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
  
CELERY_ACCEPT_CONTENT = ['application/json']
  
CELERY_TASK_SERIALIZER = 'json'
  
CELERY_RESULT_SERIALIZER = 'json'
  
CELERY_TIMEZONE = 'Africa/Nairobi'
  


五、创建异步运行任务tasks
  1.在APP目录下,如celery_proj/celery_demo目录下添加如下 tasks.py
  

#!/usr/bin/env python  
#
-*- coding: utf-8 -*-  

  
import time
  
from celery import task
  

  

  
@task()
  
def add(x, y):
  return x + y
  

  

  
@task
  
def run_test_suit(ts_id):
  print "++++++++++++++++++++++++++++++++++++"
  print('jobs[ts_id=%s] running....' % ts_id)
  time.sleep(10.0)
  print('jobs[ts_id=%s] done' % ts_id)
  result = True
  return result
  

  2.在views视图中,添加相关视图,如celery_proj/celery_demo/views.py:
  

from django.http import HttpResponse  

from .tasks import run_test_suit  

  

  

def tasks(request):print('before run_test_suit')  result
= run_test_suit.delay('110')print('after run_test_suit')return HttpResponse("job is runing background~")  

  3.添加url映射,如修改 celery_proj/celery_proj/urls.py:
  

from django.conf.urls import url  

from celery_demo import views  

  
urlpatterns
= [  url(r
'^', views.tasks, name='task'),  
]
  

  4.启动django server
  

>>python manage.py runserver  

  5.启动celery worker
  

>>celery -A celery_proj worker -l info  

  当显示如下,证明worker已启动成功:
  

E:\workspace\celery_proj>celery -A celery_proj worker -l info  

  -------------- celery@WINDOWS-QKKYZQB v3.1.23 (Cipater)
  
---- **** -----
  
--- * ***  * -- Windows-7-6.1.7601-SP1
  
-- * - **** ---
  
- ** ---------- [config]
  
- ** ---------- .> app:         celery_proj:0x33fc190
  
- ** ---------- .> transport:   redis://localhost:6379//
  
- ** ---------- .> results:     redis://localhost:6379/
  
- *** --- * --- .> concurrency: 4 (prefork)
  
-- ******* ----
  
--- ***** ----- [queues]
  -------------- .> celery           exchange=celery(direct) key=celery
  

  

  
[tasks]
  . celery_demo.tasks.add
  . celery_demo.tasks.run_test_suit
  . celery_proj.celery.debug_task
  

  
[2017-03-16 18:32:47,885: INFO/MainProcess] Connected to redis://localhost:6379//
  

  注意:每当tasks.py 修改时,都要重新启动worker
  6.访问浏览器:http://localhost:8000/
  django控制台马上输出相关打印语句并且返回 HttpResponse 响应
DSC0000.png

  但是实际上 run_test_suit 任务未完成,任务在后台运行 模拟sleep 10s后才完成,运行结果可通过celery worker 控制台输出中显示。
DSC0001.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426424-1-1.html 上篇帖子: RedisPool操作Redis,工具类实例 下篇帖子: redis缓存数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表