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文件 里面写下任务函数
import time
from celery import task @task
def sayhello():
print('hello ...')
time.sleep(2)
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帮我们托管调度。不会阻塞我们的主线程~