首页 > 其他分享 >django中使用celery,模拟商品秒杀。

django中使用celery,模拟商品秒杀。

时间:2023-02-19 19:26:09浏览次数:48  
标签:py django celery ar 秒杀 import data

Celery是Python开发的简单、灵活可靠的、处理大量消息的分布式任务调度模块

 

安装:

  pip install celery  # 安装celery库

  pip install redis  # celery依赖于redis

  pip install eventlet  # Windows下需要安装

 

项目结构:

  

 

 

主项目目录下celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# django_test是我的项目名

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_test.settings')  # 设置django环境

app = Celery('django_test')

app.config_from_object('django.conf:settings', namespace='CELERY')  # 使用CELERY_ 作为前缀,在settings中写配置

app.autodiscover_tasks()

 

在主项目下__init__.py添加下面代码

# celery
from .celery import app as celery_app
__all__ = ['celery_app']

 

在settings.py添加celery配置

# celery 配置 
redis_host = "redis://:" + redispwd + "@" + redishost + ":" + redisport + "/3"
CELERY_BROKER_URL = redis_host
redis_host = "redis://:" + redispwd + "@" + redishost + ":" + redisport + "/4"
CELERY_RESULT_BACKEND = redis_host
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES = 24 * 60 * 60
# CELERY_MAX_TASKS_PER_CHILD = 10
CELERY_TIMEZONE = 'Asia/Shanghai'

 

在app下面新建tasks.py

from __future__ import absolute_import, unicode_literals

import time

from celery import shared_task
from django.conf import settings


@shared_task
def add(x, y):
    time.sleep(30)
    print("celery结果")
    return x + y


@shared_task
def mul(x, y):
    print('x*y')
    return x * y


@shared_task
def reduce(number):

    with open(settings.BASE_DIR + '/data.py', 'r') as f:
        tot = int(f.read())
    print(tot)
    print('celery_t')
    if tot == 0:
        return 0
    else:
        data = tot - number
        with open(settings.BASE_DIR+'/data.py', 'w') as f:
            f.write(str(data))
        return 1

 

 

我的views.py文件

import datetime
import json
import traceback

from django.conf import settings
from django.contrib.auth.hashers import make_password
from django.core.cache import cache
from django.core.paginator import Paginator
from django.http import JsonResponse
from rest_framework.response import Response

from rest_framework.decorators import APIView
from . import tasks



class Test(APIView):

    def get(self, request):
        li = []
        body = request.query_params.dict()
        task_id = body.get('task_id')
        from celery import result
        ar = result.AsyncResult(task_id)
        print("--------", ar)
        print(ar.ready(), ar.state)
        if ar.ready():
            print(ar.state, ar.get())
        if ar.state == 'SUCCESS':
            ret = ar.get()

            resp = {"success": 1, "data": ret}

        elif ar.state == "FAILURE" or ar.state == "REVOKED":

            resp = {"success": 1, "data": 0}
        else:

            resp = {"success": 1, "data": 0}

        return Response(resp)

    def post(self, request):
        li = []
        resp = {"success": 1, "data": li}
        # with open(settings.BASE_DIR+'/data.py', 'r') as f:
        #     total = int(f.read())
        # print(total)

        t = tasks.reduce.delay(1)
        print(t.id)
        resp = {"success": 1, "data": t.id}
        return Response(resp)

post请求创建新的任务,get请求通过任务id查询任务状态。

我的data.py文件写入了一个数字,代表商品所剩数量,每次post请求创建新的任务,则会打开data.py文件判断里面数字是否为0,为0表示商品已被抢完,否则数字减1,表示抢到该商品。

 

标签:py,django,celery,ar,秒杀,import,data
From: https://www.cnblogs.com/moon3496694/p/17135373.html

相关文章

  • django修改认证模型类
    1.我在一个子应用下面创建了一个apps目录,且在apps下又创建了一个子应用users,结构如下图:2.在users的models.py中fromdjango.dbimportmodelsfromdjango.contrib.auth......
  • django日志集成输出器
    在配置文件中importos#⽇志LOGGING={'version':1,#自定义一个简单版本'disable_existing_loggers':False,#是否禁⽤已经存在的⽇志器'form......
  • Django Rest Frame work 如何使用serializers序列化函数新手教程
    DjangoRestFramework如何使用serializers序列化   DjangoRestFramework提供了serializers模块,用于序列化和反序列化模型实例以及原生数据类型......
  • Django Rest Frame work 如何使用serializers序列化
    DjangoRestFramework如何使用serializers序列化   DjangoRestFramework提供了serializers模块,用于序列化和反序列化模型实例以及Python原生数......
  • 【InterView】Django部分(一)
    目录ORM是什么?优势?get请求和post请求的区别简述django请求的生命周期?ORM是什么?优势?ORM:中文翻译为对象关系映射。模型类名对应数据库表名类属性对象数据库表字段类属......
  • django连接ubuntu22下的mysql8
    1.安装mysql(这里就不过多赘述了)sudoapt-getinstallmysql-server  2.登录mysql  (1)在根目录/etc/mysql/debian.cnf,使用默认账户密码登录   (2)空密码......
  • Redis实战11-实现优惠券秒杀下单
    本篇,咱们来实现优惠券秒杀下单功能。通过本篇学习,我们将会有如下收获:1:优惠券领券业务逻辑;2:分析在高并发情况下,出现超卖问题产生的原因;3:解决超卖问题两种方案:版本号法及C......
  • Celery ValueError: not enough values to unpack (expected 3, got 0)
    一:报错描述a.window10b.pycharm+python3.6.6+django2.2+restframework3.13.1+celery5.1.2c.在调用的时候报的错,启动并没有报错d.错误截图二.错误原因没抄到,wi......
  • python Django基础
    django官网https://www.djangoproject.com/download/文档https://docs.djangoproject.com/安装Django安装官网LTS版本pipinstalldjango==3.2.15Django命令>django......
  • 1.初识 Django
    设计模式定义#mysite/news/models.pyfromdjango.dbimportmodelsclassReporter(models.Model):full_name=models.CharField(max_length=70)def_......