celery 异步任务处理

当用户发起 request 请求后,并等待及返回 response 对象。在某些 view 视图函数中,可能需要执行一段耗时操作的程序,那么此时用户就会等待很长时间,由此造成极差的用户体验,例如下载或上传文件、发送邮件、 发送验证码等。此时,就可以考虑使用 celery 异步任务处理,并将耗时操作的程序放到 celery 中来执行

celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。异步任务比如是发送邮件、文件上传、 图像处理等等一些比较耗时的操作,定时任务是需要在特定时间执行的任务

celery 库是第三方模块         pip install celery
>>>项目的应用下的 views.py 
def sayhi(request):
    print("----hello----")
    time.sleep(5)
    print("---world---")
    return HttpResponse("This is say hi")

项目的 settings.py 文件中

urlpatterns = [
    url(r'^sayhi/',sayhi),
]

启动服务:         python manage.py runserver

>>>    http://127.0.0.1:8000/sayhi/

celery 异步任务处理_第1张图片

控制台:celery 异步任务处理_第2张图片


 项目下新建 包celery_task,包下面新建tasks.py文件

import os
import django
# sessionCookieLogin 是我的项目名
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sessionCookieLogin.settings")
django.setup()

# redis://127.0.0.1:6379/2 是我确定数据库为空就选择了第2个
app= Celery('celery_task.tasks',broker='redis://127.0.0.1:6379/2')

@app.task
def sayHi():
    print("-----------good good study day day up------------")
    time.sleep(5)
    print("-----------keep going------------")

因为第2个数据库被我选择了所以不为空,想选择哪个数据库可以从第一个开始查看

select 1

keys *

出现(empty list or set) 即可选择这个数据库

celery 异步任务处理_第3张图片

 先不急着运行,        先安装另外一个库         pip install eventlet

随后在tasks.py文件中输入

celery -A celery_task.tasks worker -l info -P eventlet 

重新启动服务器:        python manage.py runserver

进入        http://127.0.0.1:8000/sayhi/
celery 异步任务处理_第4张图片 

 celery 异步任务处理_第5张图片

 跳回 tasks.py 文件继续配置

from django.conf import settings
from django.core.mail import send_mail

@app.task
def send_Email(email):
    send_mail(subject="极致果蔬用户激活邮件",
              message="",
              from_email=settings.EMAIL_FROM,
              # 把目标邮箱输入
              recipient_list=[email],
              html_message='

极致果蔬,欢迎您

')

为了防止报错提前在tasks.py 文件配置:

import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sessionCookieLogin.settings")
django.setup()

在视图函数views.py里面调用异步

def send_email(request):
    """发送消息内容到邮箱"""
    # message = '点击激活'
    # # 发送邮件
    # send_mail(subject = "注册激活",
    #           message = "hello",
    #           from_email = settings.EMAIL_FROM,
    #           recipient_list = ["[email protected]"],
    #           html_message=message)
    #                目标邮箱
    send_Email.delay('[email protected]')
    return HttpResponse("OK")

启动服务器        python manage.py runserver         

#  celery_task 是我的tasks.py文件的目录名

再接着另起一个窗口执行         celery -A celery_task.tasks worker -l info -P eventlet

celery 异步任务处理_第6张图片

celery 异步任务处理_第7张图片

 

 celery 异步任务处理_第8张图片

 

你可能感兴趣的:(debian,运维)