zoukankan      html  css  js  c++  java
  • celery

    celery
    性能优化的工具。
    django是单进程的,celery能够在django框架内部开辟开启一个新进程,用来处理耗时的工作。
    这样的好处是,用户可以快速获得响应。

    celery的4个概念
    任务task:就是一个Python函数
    队列queue:将需要执行的任务加入到队列中
    工人worker:在一个新进程中,负责执行队列中的任务
    代理人broker:负责调度,在布置环境中使用redis。类似车间的队长,安排任务分配给工人干。

    celery官方文档
    中文:http://docs.jinkan.org/docs/celery/

    什么时候用celery
    1、耗时
    2、和响应结果没关系

    安装包
    celery==3.1.25
    celery-with-redis==3.0
    django-celery==3.1.17

    示例

    • 在tt_user/views.py文件中创建视图sayhello
    import time
    ...
    def sayhello(request):
        print('hello ...')
        time.sleep(2)
        print('world ...')
        return HttpResponse("hello world")
    
    • 在tt_user/urls.py中配置
        url(r'^sayhello$',views.sayhello),
    
    • 启动服务器,在浏览器中输入如下网址
    http://127.0.0.1:8000/sayhello/
    
    • 在终端中效果如下图,两次输出之间等待一段时间才会返回结果
    • 在settings.py中安装
    INSTALLED_APPS = (
      ...
      'djcelery',
    }
    
    • 在settings.py文件中配置代理和任务模块
    import djcelery
    djcelery.setup_loader()
    BROKER_URL = 'redis://127.0.0.1:6379/2'
    CELERY_IMPORTS = ('booktest.task')
    
    • 在tt_user目录下创建task.py文件
    import time
    from celery import task
    
    @task
    def sayhello():
        print('hello ...')
        time.sleep(2)
        print('world ...')
    
    • 打开tt_user/views.py文件,修改sayhello视图如下
    from . import task
    ...
    def sayhello(request):
        # print('hello ...')
        # time.sleep(2)
        # print('world ...')
        task.sayhello.delay()
        return HttpResponse("hello world")
    
    • 执行迁移生成celery需要的数据表
    python manage.py migrate
    
    • 生成表如下

    • 启动Redis,如果已经启动则不需要启动
    sudo service redis start
    
    • 启动worker
    python manage.py celery worker --loglevel=info
    
    • 启动成功后提示如下图

     

    • 打开新终端,进入虚拟环境,启动服务器,刷新浏览器
    • 在旧终端中两个输出间仍有时间间隔

    • 运行完成后如下图,注意两个终端中的时间,服务器的响应是立即返回的

    • 打开tt_user/task.py文件,修改为发送邮件的代码,就可以实现无阻塞发送邮件
    #coding=utf-8
    from django.conf import settings
    from django.core.mail import send_mail
    from celery import task
    
    @task
    def sayhello():
        msg='<a href="http://127.0.0.1/user/active/" target="_blank">点击激活</a>'
        send_mail('注册激活','',settings.EMAIL_FROM,
                  ['itcast88@163.com'],
                  html_message=msg)
  • 相关阅读:
    日期格式化
    面向对象高级编程——使用__slots__
    面向对象编程——实例属性和类属性(六)
    面向对象编程——获取对象信息(五)
    面向对象编程——类方法和静态方法(八)
    面向对象编程——多重继承(七)
    面向对象高级编程——使用@property
    python常用模块——logger模块
    python常用模块——hashlib模块
    面向对象编程——super进阶(十)
  • 原文地址:https://www.cnblogs.com/andy9468/p/11645189.html
Copyright © 2011-2022 走看看