一、逻辑分析

第一步:在项目根目录新建包

第二步:在使用提交异步任务的位置,导入使用即可

视图函数中使用,导入任务

任务.delay() # 提交任务

第三步:启动worker,如果有定时任务,启动beat

# 启动worker
celery -A celery_task worker -l info -P eventlet
# 启动beat
celery -A celery_task beat -l info

第四步:等待任务被worker执行

执行完任务之后查看任务执行的结果

二、秒杀案例

一、秒杀案例的逻辑分析:

第一:在前端用户按“秒杀”按钮

第二:就发送axios请求到后端

第三:路由匹配成功就会执行相对应的视图函数

第四:提价秒杀任务(这时借助于celery提交到任务中间件了)

第五:第一次的秒杀请求就回去了 携带者任务id在前端

第六:前端开启定时任务,每个三秒钟带着任务向后端发送请求查看是否秒杀成功

第七:在后端任务还在等待被执行返回给前端

第八:如果执行结果是秒杀成功就返回【恭喜秒杀成功】

第九:如果执行结果是秒杀失败就返回【秒杀失败】

二、具体代码实践演示

视图层代码

from celery_task.celery import app
from celery.result import AsyncResult
from celery_task.order_task import seckill_task
from rest_framework.viewsets import ViewSet
from common_response import APIResponse
from rest_framework.decorators import action class SeckillView(ViewSet):
@action(methods=['GET'], detail=False)
def seckill(self, request):
a = request.query_params.get('id')
# 使用异步 提交一个秒杀任务
res = seckill_task.delay(a)
return APIResponse(task_id=res.id) def get_result(self,request):
task_id = request.query_params.get('task_id')
a = AsyncResult(id=task_id,app=app)
if a.successful():
result = a.get()
if result:
return APIResponse(msg='秒杀成功')
else:
return APIResponse(code=101, msg='秒杀失败')
elif a.status == 'PENDING':
print('任务等待中被执行')
return APIResponse(code=666,msg='还在秒杀中')

路由层代码

from rest_framework.routers import SimpleRouter
from . import views router = SimpleRouter()
# http://127.0.0.1:8000/api/v1/user/seckill/seckill
router.register('seckill', views.SeckillView, 'seckill')
urlpatterns = [
]
urlpatterns += router.urls

前端代码

<template>
<div> <button @click="handleSeckill">秒杀</button>
</div>
</template> <script>
import Header from '@/components/Header';
import Banner from '@/components/Banner';
import Footer from '@/components/Footer'; export default {
name: 'Seckill',
data() {
return {
task_id: '',
t: null
}
},
methods: {
handleSeckill() {
this.$axios.get(this.$settings.BASE_URL + '/user/seckill/seckill/?id=1').then(res => {
this.task_id = res.data.task_id
this.t = setInterval(() => {
this.$axios.get(this.$settings.BASE_URL + '/user/seckill/get_result/?task_id=' + this.task_id).then(res => {
if (res.data.code == 666) {
//如果秒杀任务还没执行,定时任务继续执行
console.log(res.data.msg)
} else {
// 秒杀结束,无论成功失败,这个定时任务都结束
clearInterval(this.t)
this.t = null
this.$message(res.data.msg)
} })
}, 2000)
}).catch(res => { })
}
} }
</script>

celery在Django项目中的使用案例的更多相关文章

  1. celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)

    一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...

  2. 分布式队列celery 异步----Django框架中的使用

    仅仅是个人学习的过程,发现有问题欢迎留言 一.celery 介绍 celery是一种功能完备的即插即用的任务对列 celery适用异步处理问题,比如上传邮件.上传文件.图像处理等比较耗时的事情 异步执 ...

  3. [翻译]在Django项目中添加谷歌统计(Google Analytics)

    原文:<Google Analytics tracking code into Django projects, the easy way> 对我来说,制作一个可扩展的Django应用随时 ...

  4. Django项目中使用Redis

    Django项目中使用Redis DjangoRedis 1 redis Redis 是一个 key-value 存储系统,常用于缓存的存储.django-redis 基于 BSD 许可, 是一个使 ...

  5. 擦他丫的,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了!

    擦 ,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了! 问题在于我使用的谷歌浏览器,默认使用了缓存,导致每次访问同一个url时,都返回的是缓存里面的东西.通过谷歌 ...

  6. django 项目中使用多数据库 multiple databases

    假如在一个django项目中使用到了不只一个数据库, 其实这在大一点的工程中很常见,比如主从库 那么会涉及到如下一些东西 1, 定义 在settings中的DATABASE中定义会使用到的数据,比如除 ...

  7. django 项目中的 favicon.ico 处理

    django 项目中的 favicon.ico 处理  (django == 2.0.6) 1. 引入模块: from django.views.generic.base import Redirec ...

  8. Django项目中模板标签及模板的继承与引用【网站中快速布置广告】

    Django项目中模板标签及模板的继承与引用 常见模板标签 {% static %} {% for x in range(x) %}{% endfor %} 循环的序号{% forloop %} 循环 ...

  9. Django项目中"expected str, bytes or os.PathLike object, not list"错误解决:

    对于这个错误,也在于自己对django基础的掌握不是很牢固,忽略了MEDIA_ROOT的类型是string,而不是list. 错误的写法: MEDIA_ROOT = [ os.path.join(BA ...

  10. django项目中遇到要实现定时任务

    django项目中遇到要实现定时任务,所以选用了简单易用的django-crontab插件. 1.安装 django-crontab pip install django-crontab 2.定时要执 ...

随机推荐

  1. 每日一抄 Go语言封装qsort快速排序函数

    package qsort /* <GO语言高级编程>设计中案例,仅作为笔记进行收藏. qsort快速排序函数是C语⾔的⾼阶函数,⽀持⽤于⾃定义排序⽐较函数,可以对任意类型的数组进⾏排序. ...

  2. git 本地电脑重新装git后 更新github项目报错 fatal: detected dubious ownership in repository at

    解决方法参考: fatal: detected dubious ownership in repository at 'D:/'之解决方法 1.今天在学习git的时候出现这个错误: 2.执行下面代码即 ...

  3. 053_Salesforce Lightning与Classic对比

    Classic页面  Lightning页面  特点: 应用程序的切换更加方便 可以快速访问最近项目和备注等 新的记录页面布局 涡轮增压列表视图 仪表板有所变化 圆滑的报告视图 其中最重要的变化也当属 ...

  4. AWS ssm 连接实例

    aws ssm连接:aws ssm start-session \ --profile xxRole \ --region cn-northwest-1 \ --target i-08d6874428 ...

  5. http和https有什么区别?网站有没有必要启用https

    最近在浏览文章的时候发现,很多站长都在纠结网站到底要不要做https的问题.作为个人站长,也一直关注着这块.最近查阅了很多资料,对https也有了更进一步的认识,这里对https的有关问题做了一个总结 ...

  6. python基础篇 13-模块的导入 安装第三方模块

    一.模块 一个python文件就是一个模块 标准模块(内置模块) 第三方模块 需要自己安装的 自己写的 需要导入的 import 一个模块的实质: 实际上就是把一个py文件从头到尾执行了一遍,main ...

  7. mysql 增加自定义函数

    查看mysql当前是否支持编写自定义 SHOW variables like '%fun%'; 开启自定义函数 set global log_bin_trust_function_creators=1 ...

  8. Flink笔记

    高可用(HA):直白来说就是系统不会因为某台机器,或某个实例挂了,就不能提供服务了.高可用需要做到分布式.负载均衡.自动侦查.自动切换.自动恢复等. 高吞吐: 单位时间内,能传输的数据量,对应指标就是 ...

  9. SpringBoot(概述、起步依赖原理分析、SpringBoot配置(配置文件分类、YAML))

    SpringBoot概述 Spring Boot 是由 Pivotal 团队提供用来简化 Spring 的搭建和开发过程的全新框架.随着近些年来微服务技术的流行,Spring Boot 也成了时下炙手 ...

  10. Executor框架详解

    Executor框架详解 java的线程既是工作单元,也是执行机制.从jdk5开始,把工作单元与执行机制分离开来.工作单元包括Runnable和Callable,而执行机制由Executor框架提供. ...