django进阶之celery

前后端数据在交互的时候,如果说前端在规定的时间内一直得不到后端的数据响应,就会报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
预知下文,点赞之后,请看下回分解。哈哈哈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值