Django-Celery
问题
- 用户发起 request,并等待 response 返回。在 views 中,可能需要执行一段耗时的程序,那么用户就会等好长时间,造成不良好的用户体验
- 网站每小时需要同步一次天气信息,但是 http 请求是需要触发的,难道要一小时请求一次吗?
解决
- 使用
celery
:- 将耗时操作放到
celery
中执行 - 使用
celery
定时执行
- 将耗时操作放到
celery
- ** 任务 task:** 就是一个 python 函数
- ** 队列 queue:** 将要执行的任务加入到队列中
- ** 工人 worker:** 在一个新进程中,负责执行队列中的任务
- ** 代理 broker:** 负责调度,在布置环境中使用 redis
问题示例
HTML
1 | <!DOCTYPE html> |
安装
PLAINTEXT
1 | pip install celery==3.1.25 |
PLAINTEXT
1 | pip install celery-with-redis==3.0 |
PLAINTEXT
1 | pip install django-celery==3.2.1 |
-
注册应用
PYTHON1
2
3
4
5
6
7
8
9
10
11INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myApp',
'tinymce',
'djcelery',
] -
在
settings.py
末尾添加以下代码PYTHON1
2
3
4
5
6
7
8# celery
import djcelery
djcelery.setup_loader()
# 指定redis数据库
BROKER_URL = 'redis://:密码@127.0.0.1:6379/0'
# 指定任务文件
CELERY_IMPORES = ("myApp.task")
在应用目录下创建 task.py 文件,用于书写任务
PYTHON
1 | import time |
在工程目录下的 project 目录下创建一个名为 celery.py 的文件
PYTHON
1 | from __future__ import absolute_import |
在工程目录下的 project 目录下的__init__.py
文件中添加
PYTHON
1 | from project.celery import app as celery_app |
迁移
-
生成
celery
需要的数据表PYTHON1
python manage.py migrate
将任务添加到队列
PYTHON
1 | from myApp.task import longIO |
启动 redis
PLAINTEXT
1 | redis-server.exe redis.windows.conf |
启动 worker
PYTHON
1 | python manage.py celery worker --loglevel=info |
启动 Django 服务
PYTHON
1 | python manage.py runserver |