• celery 的使用


     
    celery
    介绍
    Celery是一个功能完备即插即用的异步任务队列系统。它适用于异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。
    Celery的特点是:
    • 简单,易于使用和维护,有丰富的文档。
    • 高效,单个celery进程每分钟可以处理数百万个任务。
    • 灵活,celery中几乎每个部分都可以自定义扩展。
    任务队列是一种跨线程、跨机器工作的一种机制.
    任务队列中包含称作任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理.
    celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的信息派发给worker来处理。
    Celery的架构
    Celery的架构由三部分组成,消息队列(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。````
     
     
     
     
     
    一个celery系统可以包含很多的worker和broker
    使用场景
    1)可以在 Request-Response 循环之外执行的操作:发送邮件、推送消息。
    2)耗时的操作:调用第三方 API、视频处理(前端通过 AJAX 展示进度和结果)
    异步发送短信,第一时间返回消息。
    3)周期性任务:取代 crontab。
     
     
    Celery本身不提供消息队列功能,但是可以很方便地和第三方提供的消息中间件进行集成,包括RabbitMQ,Redis,MongoDB等
    安装
    pip install -U celery  -u 是update的意思 更新
    编译安装
    也可从官方直接下载安装包:https://pypi.python.org/pypi/celery/
    tar xvfz celery-0.0.0.tar.gz
    cd celery-0.0.0
    python setup.py build
    python setup.py install
    使用
    使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例,我们一般叫做celery应用,或者更简单直接叫做一个app。app应用是我们使用celery所有功能的入口,比如创建任务,管理任务等,在使用celery的时候,app必须能够被其他的模块导入。
    一般celery任务目录直接放在项目的根目录下即可,路径:
    项目主目录/
    ├── mycelery/
       ├── config.py     # 配置文件
       ├── __init__.py  
       ├── main.py       # 主程序
       └── 任务目录一/          # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖
           └── tasks.py  # 任务的文件,名称必须是这个!!!
       └── 任务目录二/          # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖
           └── tasks.py  # 任务的文件,名称必须是这个!!!
    main.py,代码:
    # 主程序
    from celery import Celery
    # 创建celery实例对象
    app =Celery("task_name")
    # 通过app对象加载配置
    app.config_from_object("mycelery.config")
    # 自动搜索并加载任务
    # 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
    # app.autodiscover_tasks(["任务1","任务2",....])
    app.autodiscover_tasks(["mycelery.sms","mycelery.cache"])
    # 启动Celery的命令
    # 强烈建议切换目录到项目的根目录下启动celery!!
    # celery -A mycelerymain worker --loglevel=info
    配置文件config.py,代码:
    #使用redis
    # 任务队列的链接地址
    broker_url ='redis://127.0.0.1:6379/15'
    # 结果队列的链接地址
    result_backend ='redis://127.0.0.1:6379/14'
    #使用rabbitmq
    BROKER_URL='amqp://guest:guest@localhost:5672//'
    创建一个任务文件sms/tasks.py,并创建任务,代码:
    # celery的任务必须写在tasks.py的文件中,别的文件名称不识别!!!
    from mycelery.main import app
    @app.task  # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
    def send_sms():
       print("发送短信!!!")
    @app.task(name="send_sms2")  # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
    def send_sms2():
       print("发送短信任务2!!!")
    #失败自动重试的方法
    @app.task(bind=True, default_retry_delay=30*60)  # retry in30 minutes.
    def add(self, x, y):
    try:
        except Exception as exc:
            raise self.retry(exc=exc, countdown=60)  # override the default and
                                                     # retry in1 minute
    接下来,我们运行celery,效果如下:
     
     
     
     
     
    在程序中调用上面的异步任务,拿django进行举例:
    # 调用celery执行异步任务
    from my_celery.sms.tasks import send_sms
    send_sms.delay(mobile) # 调用 参数是mobile
    其他参考文档:
    接下来,我们需要把celery和django组合起来一起使用。
     
     
     
     

    1.Celery基本使

    用.pdf

    472.08KB
     
     

    1.Celery基本使

    用.pdf

    472.08KB
     
     
     

    2.Celery进阶使

    用.pdf

    353.15KB
     
     

    2.Celery进阶使

    用.pdf

    353.15KB
     
     
     

    3.django-celery实现异步HTTP请

    求.pdf

    445.39KB
     
     

    3.django-celery实现异步HTTP请

    求.pdf

    445.39KB
     
    调度任务
    # delay 方法 是apply_asynic()的快捷调度方法
    from tasks import add
    add.delay(arg1,arg2,kwarg1='x',kwarg2='y')
    add.delay(*args,**kwargs).apply_async(args, kwargs)
    # apply_async
    task.apply_async(args=[arg1,arg2], kwargs={'kwargs':'x','kwargs':'y'})
    tasks.apply_async((arg,),{'kwarg': value})
    # 从现在起10秒内执行
    tasks.apply_async(args=[10,20], countdown=60)
    # 从现在起10秒内执行,使用指定eta
    tasks.apply_async(eta=now +timedelta(seconds=10))
    # 从现在起一分钟后执行,但在2分钟后过期
    tasks.apply_async(countdown=60, expires=120)
    # 在2天后到期,设置使用datetime对象
    T.apply_async(expires=now +timedelta(days=2))
    # send_task:任务未在当前进程中注册
    app.send_task('任务', args=[arg,], queue='default')
    # signature用于传递任务调用签名的对象(例如通过网络发送),并且它们也支持calling api
    task.s(arg1,arg2,kwarg1='x',kwargs2='y').apply_async()
    # 返回值 
    delay() 和 apply_async() 的返回值是一个 AsyncResult 的对象。通过该对象,能够获得任务的状态。
     
    flask框架与celery结合
    不需要使用任何第三方组件,无缝连接celery
    from flask import Flask
    from celery import Celery
    
    
    app =Flask(__name__)
    app.config['CELERY_BROKER_URL']='redis://localhost:6379/0'
    app.config['CELERY_RESULT_BACKEND']='redis://localhost:6379/0' # 结果存储值
    app.config["CELERY_ROUTES"]={
    'worker.test1':{'queue':'test1'},
    'worker.test2':{'queue':'test2'},
    'worker.test3':{'queue':'test3'},
    }
    celery =Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config) #我们能够为Celery同步Flask上的配置
     
     
     
     
    把django和celery进行组合
    ` 在main.py主程序中对django的配置文件进行加载
    # 主程序
    import os
    from celery import Celery
    # 创建celery实例对象
    app =Celery("luffy")
    # 把celery和django进行组合,识别和加载django的配置文件
    os.environ.setdefault('DJANGO_SETTINGS_MODULE','luffyapi.settings.dev')
    # 对django框架执行初始化
    import django
    django.setup()
    # 通过app对象加载配置
    app.config_from_object("mycelery.config")
    # 加载任务
    # 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
    # app.autodiscover_tasks(["任务1","任务2"])
    app.autodiscover_tasks(["mycelery.sms","mycelery.cache"])
    # 启动Celery的命令
    # 强烈建议切换目录到mycelery根目录下启动
    # celery -A main worker --loglevel=info
    在需要使用django配置的任务中,直接加载配置,所以我们把注册的短信发送功能,整合成一个任务函数,代码:
    from my_celery.main import app
    from.yuntongxun.sms importCCP
    from luffyapi.settings import constants
    import logging
    log = logging.getLogger("django")
    # @app.task(name="send_sms")
    # def send_sms(mobile):
    #     print("发送短信给%s的异步任务执行了"% mobile)
    #     return"任务结果!"
    @app.task(name="send_sms")
    def send_sms(mobile, sms_code):
       """异步发送短信"""
       ccp =CCP()
       try:
           result = ccp.send_template_sms(mobile,[sms_code, constants.SMS_EXPIRE_TIME//60 ], constants.SMS_TEMPLATE_ID)
           return result
       except:
           log.error("发送短信验证码失败!手机号:%s"% mobile)
    在这个任务中,我们需要加载短信发送的sdk和相关的配置常量,所以我们可以直接把django中的短信发送模块和相关的常量配置文件直接剪切到当前sms任务目录中
    mycelery/
    ├── config.py
    ├── __init__.py
    ├── main.py
    └── sms/
       ├── constant.py
       ├── __init__.py
       ├── tasks.py
       └── yuntongxun
           ├── CCPRestSDK.py
           ├── __init__.py
           ├── sms.py
           └── xmltojson.py
    再次启动项目即可。
    最终在django里面,我们调用Celery来异步执行任务。需要完成2个步骤:
    # 1. 声明一个和celery一模一样的任务函数,但是我们可以导包来解决
    from mycelery.sms.tasks import send_sms
    # 2. 调用任务函数,发布任务
    send_sms.delay(mobile,code)
    # send_sms.delay() 如果调用的任务函数没有参数,则不需要填写任何内容
     
  • 相关阅读:
    delphi string.split 按照任意字符串分割语句
    学习 TTreeView [16]
    学习 TTreeView [15]
    delphi TClientDatset资料
    delphi7 clientdataset 详解
    为TMenuItem增加指针Data属性
    构建一个用于产品介绍的WEB应用
    图片延迟加载技术-Lazyload的应用
    你想不到的压缩方法:将javascript文件压缩成PNG图像存储
    如何更快速加载你的JS页面
  • 原文地址:https://www.cnblogs.com/well-666/p/12953853.html
Copyright © 2020-2023  润新知