zoukankan      html  css  js  c++  java
  • Celery结合Django使用

    一、Celery介绍

    Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子:

    1. 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。 
    2. 你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福

    Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redis

    1.1 Celery有以下优点:

    1. 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
    2. 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
    3. 快速:一个单进程的celery每分钟可处理上百万个任务
    4. 灵活: 几乎celery的各个组件都可以被扩展及自定制

    Celery基本工作流程图

    二、在Django项目中使用celery 

    可以把celery配置成一个应用

    目录格式如下

    proj/__init__.py
        /celery.py   
        /tasks.py     #名字固定
    

    proj/celery.py内容

     1 from __future__ import absolute_import, unicode_literals   
     2 #absolute_import (从绝对路径即celery安装目录导入celery,防止导入当前同名模块) unicode_literals(兼容python2和3)
     3 from celery import Celery
     4  
     5 app = Celery('proj',  #app名
     6              broker='redis://:password@127.0.0.1',      #接收任务使用的中间件
     7              backend='redis://:password@127.0.0.1',     #取数据时用的中间件
     8              include=['proj.tasks'])                    #把tasks注册,当有多个tasks时可添加
     9  
    10 # Optional configuration, see the application user guide.  还可以设置配置文件,实现更多自定义功能
    11 #app.conf.update(
    12 #    result_expires=3600,   #结果只保存3600s
    13 #)
    14  
    15 if __name__ == '__main__':
    16     app.start()
    celery.py

    proj/tasks.py中的内容

     1 from __future__ import absolute_import, unicode_literals
     2 from .celery import app  #导入当前路径的celery模块
     3 
     4 
     5 @app.task
     6 def add(x, y):
     7     return x + y
     8 
     9 
    10 @app.task
    11 def mul(x, y):
    12     return x * y
    13 
    14 
    15 @app.task
    16 def xsum(numbers):
    17     return sum(numbers)
    tasks.py

    启动worker 

    $ celery -A proj worker -l info  

    启动多个worker

    $ celery multi start w1 -A proj -l info
    
    $ celery  multi restart w1 -A proj -l info   #重启worker
    
    $ celery multi stop w1 -A proj -l info       #stop worker
    
    
    由于停止命令是异步的,所以它不会等待worker完成所有任务再关闭。您可能希望使用stopwait命令,这确保在退出之前完成所有当前执行的任务: 
    
    $ celery multi stopwait w1 -A proj -l info
    

    在你的django views里调用celery task  

    from django.shortcuts import render,HttpResponse
     
    # Create your views here.
     
    from  bernard import tasks
     
    def task_test(request):
     
        res = tasks.add.delay(228,24)  #使用delay才会远程执行  返回的res是task_id,通过task_id取任务结果
        print("start running task")
        print("async task res",res.get() )
     
        return HttpResponse('res %s'%res.get())
    

      

    三、Django中的Celery 定时任务

    1.Use pip to install the package:

    $ pip install django-celery-beat
    

    2. 将django_celery_beat 模块 添加到Django项目settings.py中的INSTALLED_APPS :

     INSTALLED_APPS = (
            ...,
            'django_celery_beat',
      )
    

    3.更新数据库会自动创建几张表:

    $ python manage.py migrate
    

    4.使用Django调度器开启 celery beat service

    $ celery -A proj beat -l info -S django
    

    5.访问Django管理界面以添加一些周期性任务。

    在admin页面里,有3张表

    配置完长这样

    此时启动你的celery beat 和worker,会发现每隔2分钟,beat会发起一个任务消息让worker执行scp_task任务

    !!注意,经测试,每添加或修改一个任务,celery beat都需要重启一次,要不然新的配置不会被celery beat进程读到

      

  • 相关阅读:
    案例3:歌舞娱乐放映游艺建筑防火案例分析(一)
    案例2:丙类仓库建筑防火案例分析
    第三篇 第八章泡沫灭火系统(二)
    第三篇 第七章气体灭火系统(三)
    FreeMarker 语法 null 的处理
    FreeMarker 语法 date 类型处理
    FreeMarker 语法 list
    FreeMarker 语法 访问 pojo 的属性
    mysql 去重
    FreeMarker hello
  • 原文地址:https://www.cnblogs.com/dominik/p/9998162.html
Copyright © 2011-2022 走看看