django celery 实现异步发送邮件

celery 是为了解决有些view中可能需要执行一段耗时的操作,用户体验度不好的问题的

所以为了解决这个,就可以将耗时操作的程序放到celery中执行。也就是celery会帮我们起一个进程,执行那个耗时程序,也是一种异步了

celery的组成:

        任务task:就是一个Python函数,会将耗时程序封装成函数,再包装成任务

        队列queue:将需要执行的任务加入到队列中,以供工人来按顺序执行

        工人worker:在一个新进程中,负责执行队列中的任务

        代理broker:负责调度任务,在布置环境中使用redis


下面在django中模拟一下如何用celery:

首先先看没有用celery的程序

        


这就造成不良好的用户体验了,那你先给用户返回程序执行成功,再在后台执行这5秒


下面就用selery


1.安装selery ,不写版本号默认最新,新版本只需要安装一个celery

pip install celery==3.1.25

pip install celery-with-redis==3.0

pip install django-celery==3.2.1


2.在应用目录下创建名为task.py的文件,该文件用于封装耗时任务的


3.配置setting.py


  3.1注册进app

  INSTALLED_APP=[

    . . . .  +

 ‘djcelery’]


   3.2 再加上,

   import djcelery

   djcelery.setup_loader()

   BROKER_URL='redis://:密码@数据库ip地址:6379/0'      #格式不能错 ,注意分号

   CELERY_IMPORTS=(‘myApp.task’)        #任务文件


4.迁移,生成celery需要的表

python manage.migrate


5.将名为celery.py的文件加入到同工程目录同名的目录下,这个文件是官网给我们写好的

from __future__ import absolute_import

import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'whthas_home.settings')

app = Celery('project')     #这里改成自己工程名

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))




6.修改与工程目录同名目录下的__init__.py文件,上图红色箭头指处

from project.celery import app as celery_app

7.将耗时程序封装成任务,在task.py文件里



在view.py文件里


这时你去跑程序,会发现很快,但却没有打印开始与结束这两句,其实它没有执行到耗时程序,还缺最后一步


8.启动redis,确保服务器启动


9.启动worker,在黑窗口进入工程目录下,执行命令

python manage.py celery worker --loglevel=info


访问浏览器,就可以看到很快的返回程序执行成功,而耗时程序在黑窗口进行打印:开始程序执行,等待5秒,结束程序执行

相互不影响

浏览器返回


 黑窗口打印




©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页