zoukankan      html  css  js  c++  java
  • 异步任务利器Celery(一)介绍

    django项目开发中遇到过一些问题,发送请求后服务器要进行一系列耗时非常长的操作,用户要等待很久的时间。可不可以立刻对用户返回响应,然后在后台运行那些操作呢?

    crontab定时任务很难达到这样的要求 ,异步任务是很好的解决方法,有一个使用python写的非常好用的异步任务工具Celery。

    broker、worker和backend

    Celery的架构由三部分组成,消息中间件(broker),任务执行单元(worker)和任务执行结果存储(result backends)组成。

    应用程序调用Celery的时候,会向broker传递消息,而后worker将会取到消息,对程序进行执行,backend用于存储这些消息以及Celery执行的结果。

    消息中间件broker

    Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。

    RabbitMQ是最好的消息中间件,使用方法如下:

    Using RabbitMQ

    Redis也是可行的,虽然有信息丢失的风险:

    Using Redis

    其余broker Broker Overview

    任务执行单元worker

    Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

    任务结果存储backend

    用来存储Worker执行的任务的结果:SQLAlchemy/Django ORM, MemcachedRedisRPC (RabbitMQ/AMQP)。

    下载

    下载Celery很简单:

    $ pip install celery
    

    这里使用Redis作为broker实践一下,需要额外的库支持,可以一起下载:

    $ pip install -U "celery[redis]"
    

    写应用程序

    写一个简单的应用tasks.py:

    from celery import Celery
    
    app = Celery('tasks', broker='redis://localhost:6379/0')
    
    @app.task
    def add(x, y):
        return x + y
    

    运行worker

    在命令行中运行:

    $ celery -A tasks worker --loglevel=info
    

    输出如下:

    [2017-09-10 06:59:58,665: INFO/MainProcess] Connected to redis://localhost:6379/0
    [2017-09-10 06:59:58,671: INFO/MainProcess] mingle: searching for neighbors
    [2017-09-10 06:59:59,688: INFO/MainProcess] mingle: all alone
    [2017-09-10 06:59:59,724: INFO/MainProcess] celery@ubuntu ready.
    

    发送任务

    进入python环境:

    >>> from tasks import add
    >>> add.delay(4, 4)
    

    worker里就可以看到任务处理的消息:

    [2017-09-10 07:02:34,874: INFO/MainProcess] Received task: task.add[40ec89c8-0a23-4a26-9da0-7f418c50f4cb]  
    [2017-09-10 07:02:34,876: INFO/ForkPoolWorker-1] Task task.add[40ec89c8-0a23-4a26-9da0-7f418c50f4cb] succeeded in 0.000579041981837s: 8
    

    存储结果

    使用Redis作为存储backend,在tasks.py中修改:

    app = Celery('tasks', backend='redis://localhost:6379/0', broker='redis://localhost:6379/0')
    

    运行后就可以查看结果了:

    >>> from task import add
    >>> r=add.delay(3,4)
    >>> r.result
    7
    >>> r.ready()
    True
    >>> r.get(timeout=1)
    7
    

    可以查看Redis中的存储:

    127.0.0.1:6379> get celery-task-meta-f2032d3e-f9a0-425d-bce4-f55ce58c8706
    "{"status": "SUCCESS", "traceback": null, "result": 7, "task_id": "f2032d3e-f9a0-425d-bce4-f55ce58c8706", "children": []}"
    127.0.0.1:6379> 

    超级简单,想要对Celery做更进一步的了解,请参考官方文档

  • 相关阅读:
    CSS 文本换行及指定行数显示
    JavaScript随机生成六位数
    Vue 添加评论,node作后台保存到MongoDB数据库中
    详情页面中根据ID请求数据
    多线程学习笔记
    串口 PLC 编程FAQ
    NI CWGraph 显示波形图
    华为企业级AS111-S,比较垃圾的地方
    jqmobile FAQ
    给easyui datebox扩展一个清空按钮,无侵入
  • 原文地址:https://www.cnblogs.com/linxiyue/p/7502561.html
Copyright © 2011-2022 走看看