zoukankan      html  css  js  c++  java
  • Django 异步化库celery和定时任务

    首先要了解Django其实是个同步框架,那么多个用户发送请求时就会发生排队的情况上一个用户的请求完成后在进行下一个,这样会对影响用户体验,所有就要用到异步方法来解决。

    首先我们要安装celery库

    pip install celery   celery的基础库

    pip install celery-with-redis  celery对redis的库

    pip install django-celery  celery对django的库

    安装完成后要在settings.py内进行设置

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'demo',
        'djcelery'           # 添加  djcelery应用
    )        
    #配置celery
    import djcelery
    djcelery.setup_loader()
    BROKER_URL = 'redis://127.0.0.1:6379'
    CELERY_IMPORTS = ('mymac.tasks')

    还要在同级目录下建立一个 celert.py文件

    #导包
    import os
    import django
    from celery import Celery
    from django.conf import settings 
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mymac.settings')
    django.setup()
    app = Celery('mymac')
    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))

    然后建立一个py文件 创建celert异步方法

    #导包
    import time
    #导入异步任务
    from celery.task import task
    
    #task使用装饰器用法
    @task
    def say(x,y):
        #稍后用于方便查看异步
        time.sleep(5)
        return x+y

    在视图方法导入写好的异步方法,配置好相应路由访问即可

    from django.shortcuts import render,redirect
    #导包
    from django.http import HttpResponse,HttpResponseRedirect
    #导入类视图 
    from django.views import View
    #导入异步方法
    from mymac.tasks import sayl
    
    def celery_test(request):
        #用delay传参
        print(say.delay('123','123'))
        return HttpResponse('异步测试')

    那怎么看是否是异步呢

    我们需要在启动一个监听异步的服务,需要进入你的项目文件来启动服务命令是  celery -A mymac worker -l info   mymac为项目名

    然后我们去发送请求,连续刷新相应请求页面已达到模拟多个用户同时访问

    这个时候我们可以看到多个请求在发送但是我们在方法里设置了延时5秒所有只发送并没有完成

    5秒后我们看到都开始相继完成了

    celery内也有定时任务方法 

    #导入定时任务库
    from celery.decorators import periodic_task
    #利用参数来设置任务周期
    @periodic_task(run_every=10)
    def some_task():
        print('每十秒执行一次')
        time.sleep(5)
        print('执行完毕')
        return True

    设置好后就会自动运行 

    也可以在  celery -A mymac worker -l info  监听异步内监听因为它本身也是异步的。

    还可以在  celery -A mymac beat -l info  内查看定时任务。

  • 相关阅读:
    worldWind发布1.3.2版本了
    XMLSerializer中数组对象的设定
    IE6+UTF8的一个怪异问题
    恢复ServU管理员密码方法
    asp.net中的窗体身份验证(不同的角色访问不同的目录)
    什么是 Landing Page?
    如何让排名更加稳定
    JS替换空格回车换行符
    外部调用ZBLOG文章的方法
    表单填写字母时大小写自动互转(CSS方式)
  • 原文地址:https://www.cnblogs.com/Niuxingyu/p/10557594.html
Copyright © 2011-2022 走看看