Celery学习--- Celery 最佳实践之与django结合实现异步任务
django 可以轻松跟celery结合实现异步任务,只需简单配置即可
同步执行和异步执行
注意:即使Celery的任务没有执行完成,但是已经创建了任务ID。可以利用前台的定时任务发送Ajax异步请求根据ID查询结果
项目整合
项目的目录结构:

项目前提: 安装并启动Redis

CeleryTest/settings.py
INSTALLED_APPS = [
...
'app01', # 注册app
]
MIDDLEWARE = [
...
# 'django.middleware.csrf.CsrfViewMiddleware',
...
] STATICFILES_DIRS = (os.path.join(BASE_DIR, "statics"),) # 现添加的配置,这里是元组,注意逗号
TEMPLATES = [
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
]
# for celery
CELERY_BROKER_URL = 'redis://192.168.2.105',
CELERY_BACKEND_URL = 'redis://192.168.2.105', # 用于Celery的返回结果的接收
CeleryTest/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from app01 import views
urlpatterns = [
url(r'index/', views.Index),
url(r'task_res/', views.task_res),
]
app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import tasks
# Create your views here.
# 视图触发Celery的用户请求 def Index(request):
print('进入Index...')
res1 = tasks.add(5, 999)
res = tasks.add.delay(5, 1000)
print("res:", res)
return HttpResponse(res) # 前台通过ID获取Celery的结果
from celery.result import AsyncResult
def task_res(request):
result = AsyncResult(id="5cf8ad07-8770-450e-9ccd-8244e8eeed19")
# return HttpResponse(result.get())
return HttpResponse(result.status) # 状态有Pending, Success, Failure等结果
app01/tasks.py 文件名必须为tasks.py
# 文件名必须为tasks.py,Djaogo才能发现Celery
from __future__ import absolute_import, unicode_literals
from celery import shared_task # Django starts so that the @shared_task decorator (mentioned later) will use it:
@shared_task # Django的各个App里都可以导入这个任务,否则只能在app01这个Django的App内使用
def add(x, y):
return x + y @shared_task
def mul(x, y):
return x * y @shared_task
def xsum(numbers):
return sum(numbers)
CeleryTest/celery.py 文件名必须为celery.py
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', 'CeleryTest.settings') app = Celery('CeleryTest') # 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))
CeleryTest/__init__.py
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']
Django前台运行结果[获取到了任务ID]:此时只有Django操作

Django后台运行结果:此时只有Django操作

上传文件到Linux服务器【Linux服务器需安装好Django服务】
需要Ubuntu下安装Django
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django

Linux下启动Celery的worker: 【此时Win7下的Django配合Linux下的Celery执行】
omc@omc-virtual-machine:~/Celery/CeleryTest$ celery -A CeleryTest worker -l info

前台浏览器触发Django的views请求到Linux的Celery的worker进行结果处理


梳理一下整个的流程:
Win7下的Django配置好了和Celery的整合,连接上Redis。当有请求从浏览器发送过来的时候,从URL映射到Django的views里面,在views里面调用了tasks.add.delay(5, 1000)此时将任务请求存储在了Redis里面。后台Linux下同样也放了一份根Win7下同样的工程[实际上只需要Celery的部分即可],进入Linux下的目录后启动Celery的worker,worker从Redis中取出任务去执行。而与此同时Django已经将任务的ID返回给了前台,前台可以根据任务ID返回的状态判断任务是否完成,完成后从Redis中获取任务的结果进行页面渲染即可,从而达到了异步的效果,就是前台不用直接等待结果的返回,而是根据结果的状态来获取最后的结果。
Linux下安装Django
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django

问题解决
【20180430】一个由于Django版本和Celery版本差异引起的错误,导致一下午很失落,最后误打误撞解决,很失望
报错信息:
KeyError: 'backend'
During handling of the above exception, another exception occurred:

settings.py ---Celery的配置错误:
# for celery
CELERY_BROKER_URL = 'redis://192.168.2.105',
CELERY_RESULT_BACKEND = 'redis://192.168.2.105', # 用于Celery的返回结果的接收
问题解决:
settings.py
# for celery
CELERY_BROKER_URL = 'redis://192.168.2.105',
CELERY_BACKEND_URL = 'redis://192.168.2.105', # 用于Celery的返回结果的接收
Celery学习--- Celery 最佳实践之与django结合实现异步任务的更多相关文章
- Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...
- Celery学习---Celery 与django结合实现计划任务功能
项目的目录结构: 项目前提: 安装并启动Redis 安装Django和Celery的定时任务插件 安装方法一: pip直接安装[安装了pip的前提下] omc@omc-virtual-machine: ...
- Celery学习--- Celery操作之定时任务
celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat 文件定时执行任务 项目前提: 安装并启动Redis celery_Sche ...
- Celery学习--- Celery在项目中的使用
可以把celery配置成一个应用,注意连接文件命名必须为celery.py 目录格式如下 项目前提: 安装并启动Redis CeleryPro/celery.py [命名必须为celery.py] ...
- Celery学习---Celery 分布式队列介绍及安装
Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...
- 学习JavaScript最佳实践方法
首先要说明的是,咱现在不是高手,最多还是一个半桶水,算是入了JS的门. 谈不上经验,都是一些教训. 这个时候有人要说,“靠,你丫半桶水,凭啥教我们”.您先别急着骂,先听我说. 你叫一个大学生去教小学数 ...
- 学习shiro最佳实践,绝对正确
按照https://blog.csdn.net/qq_34021712/column/info/26947学习,基本能解决shiro一切问题,谢谢该博主
- celery最佳实践
作为一个Celery使用重度用户.看到Celery Best Practices这篇文章.不由得菊花一紧. 干脆翻译出来,同一时候也会添加我们项目中celery的实战经验. 至于Celery为何物,看 ...
- Celery最佳实践(转)
原文:http://my.oschina.net/siddontang/blog/284107 英文原文:https://denibertovic.com/posts/celery-best-prac ...
随机推荐
- 常见的接口与类 -- Comparable
目录 1. 接口概述 2. 接口方法详读 3. 接口方法的实践操作 3.1 String和Integer对于compareTo()的实现 正文 接口Comparable 我们在字符串中见到过Comp ...
- Servlet多文件上传
各位大侠可能会对263电子邮箱中的"上传附件"功能有印象,就是:在浏览 器中点击"浏览",弹出一个对话框,选中文件后,单击"确定",文件就被 ...
- 使用JS导出页面内容到Excel
JS代码 <script> $(function(){ // 使用outerHTML属性获取整个table元素的HTML代码(包括<table>标签),然后包装成一个完整的HT ...
- ClickOnce 发布WinForm应用程序(非签名方式)
ClickOnce IIS7发布WinForm应用程序,非签名方式(不勾选签名中的"为ClickOnce清单签名") 一.在D盘上建一个文件夹”MyAppPath”. 该 ...
- 通过set赋值,与select赋值的区别
---通过set赋值,与select赋值的区别.declare @a int--set @a=(select count(*) from TblStudent)select @a=count(*) f ...
- SSM+Redis+Shiro+Maven框架搭建及集成应用
引文: 本文主要讲述项目框架搭建时的一些简单的使用配置,教你如何快速进行项目框架搭建. 技术: Spring+SpringMVC+Mybatis+Redis+Shiro+Maven ...
- 响应式布局和BootStrap 全局CSS样式
1.什么是响应式布局 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,这个概念是为解决移动互联网浏览而诞生的. 简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一 ...
- xshell复制粘贴
用户看到这个标题肯定会觉得小编脑子坏掉了,复制粘贴不就是Ctrl+C,Ctrl+V嘛,但是在xshell却不尽然. 现象: 在xshell界面中需要用到之前的一段代码,自然是选中,熟练的键入Ctrl+ ...
- java运算符优先级别
算数-->关系-->逻辑-->赋值
- 当碰到需要调试打包后的js
在react中经常开发碰到不能热更中进行调试的,如IE之类的 这个时候我们就需要打包才能运行看到效果, 但是往往每次打包都需要很长的时间: 这个时候我们就可以直接找到打包后的文件,直接在改文件中修改: ...