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 内查看定时任务。