celery
情景:用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等。
使用celery后,情况就不一样了。解决:将耗时的程序放到celery中执行。
- 点击查看celery官方网站
- 点击查看celery中文文档
celery名词:
- 任务task:就是一个Python函数。
- 队列queue:将需要执行的任务加入到队列中。
- 工人worker:在一个新进程中,负责执行队列中的任务。
- 代理人broker:负责调度,在布置环境中使用redis。
1 首先在运行django框架的环境当中安装:
celery==3.1.25 django-celery==3.1.17
2 在项目的settings.py中进行如下配置
注册app中添加djcelery
INSTALLED_APPS = ( ... 'djcelery', }
配置任务代理和任务模块
import djcelery djcelery.setup_loader() BROKER_URL = 'redis://127.0.0.1:6379/2'
这里 reids是存放任务的队列。要确保环境中有redis服务
3 在应用目录下建立一个任务tasts.py文件 里面写下任务函数
1 import time 2 from celery import task 3
4 @task 5 def sayhello(): 6 print('hello ...') 7 time.sleep(2) 8 print('world ...')
这里将函数用task装饰之后,django就会在我们的模块中找,如果这个函数被调用的时候,就自动添加到celery队列当中,队列帮我们执行
4 在视图当中调用
from booktest import tasks ... def sayhello(request): # print('hello ...')
# time.sleep(2)
# print('world ...')
tasks.sayhello.delay() return HttpResponse("hello world")
切记要引入刚刚任务文件,
并且调用的时候不能直接调用,要任务函数.delay() 进行调用
如果任务函数要参数,则将参数表传给delay()
5 执行迁移
python manage.py migrate
6 启用redis服务器
sudo service redis start
7 启动celery的worker
python manage.py celery worker --loglevel=info
在这之后,可以运行我们的功能模块,当任务函数被调用的时候,就会送进celery队列,有celery帮我们托管调度。不会阻塞我们的主线程~