Django 异步化库celery和定时任务

时间:2021-03-25 07:50:16

首先要了解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为项目名

Django 异步化库celery和定时任务

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

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

Django 异步化库celery和定时任务

 

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

Django 异步化库celery和定时任务

 

 

 

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