前后端数据在交互的时候,如果说前端在规定的时间内一直得不到后端的数据响应,就会报304,服务器加载异常的错误。所以说,这个时候异步是最好的选择,即能及时的给前端响应,又能让代码正常运行。
项目名称:data_bank_stuff app:Strategycenter
第一步: 安装celery
> pip install django-celery==3.2.2
>
> pip install django-redis
>
> pip install flower # celery 的web管理平台(异步任务可视化)
第二步:要在django,settings.py中配置celery
import djcelery
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Strategycenter',
'djcelery', #加入djcelery
]
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/1'
CELERY_IMPORTS = ('Strategycenter.tasks')
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
from celery.schedules import crontab
from celery.schedules import timedelta
#如果不加定时任务的话,这个可以不用写
CELERYBEAT_SCHEDULE = { #定时器策略
#定时任务一: 每隔30s运行一次
u'测试定时器1': {
"task": "art.tasks.tsend_email",
#"schedule": crontab(minute='*/2'), # or 'schedule': timedelta(seconds=3),
"schedule":timedelta(seconds=30),
"args": (),
},
}
注解:这个注解是来自于:(https://segmentfault.com/a/1190000016082551)
当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task
BROKER_URL:broker是代理人,它负责分发任务给worker去执行。我使用的是Redis作为broker
没有设置 CELERY_RESULT_BACKEND,默认没有配置,此时Django会使用默认的数据库(也是你指定的orm数据库)。
CELERY_IMPORTS:是导入目标任务文件
CELERYBEAT_SCHEDULER:使用了django-celery默认的数据库调度模型,任务执行周期都被存在默认指定的orm数据库中.
CELERYBEAT_SCHEDULE:设置定时的时间配置, 可以精确到秒,分钟,小时,天,周等。
第三步:在项目里面添加celery.py
# encoding: utf-8
#目的是拒绝隐式引入,celery.py和celery冲突。
from __future__ import absolute_import,unicode_literals
import os
from celery import Celery, platforms
from django.conf import settings
platforms.C_FORCE_ROOT = True
# 设置环境变量
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "data_bank_stuff.settings")
#创建celery应用,这里设置backend,对后面检测celery任务是否完成,大有用处
app = Celery('Strategycenter',backend='amqp')
app.config_from_object('django.conf:settings')
#如果在工程的应用中创建了tasks.py模块,那么Celery应用就会自动去检索创建的任务。比如你添加了一个任#务,在django中会实时地检索出来。
app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
第四步:针对views.py文件里面,需要异步的方法做调整
from .tasks import *
def test(request):
a=1
b=2
testHandle.delay(a,b)
return HttpResponse('ok')
第五步:添加app下面的tasks.py文件
# encoding: utf-8
from __future__ import absolute_import
import time
from django.core.mail import send_mail
from celery.utils.log import get_task_logger
from artproject.celery import app
from art.utils.send_mail import pack_html, send_email
@app.task
def testHandle(a,b):
time.sleep(20)
print('111111')
time.sleep(10)
return a+b
配置完成后,接下来一定要记得迁移
python manage.py migrate
会看到窗口生成下面几个结构
celery_taskmeta |
| celery_tasksetmeta |
| djcelery_crontabschedule |
| djcelery_intervalschedule |
| djcelery_periodictask |
| djcelery_periodictasks |
| djcelery_taskstate |
| djcelery_workerstate
大功告成的倒数第二步,就是运行我们的代码
这个时候就需要在另开一个窗口,为啥呢,就不说了哈哈哈哈哈
python manage.py celery worker --loglevel=info
以上我们的task任务算是完成了,大家可以根据django的老路数,mvt去测试一下是否成功。
为啥说是倒数第二步呢,因为我们这个是异步,前端不用等后端代码运行完已经给了响应,那使用网站的人想知道代码是否真的完成,怎么办呢,这个时候就要来不停地检测我们的celery了。
感谢:很详细的讲解celery
预知下文,点赞之后,请看下回分解。哈哈哈