• 异步任务利器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很简单:

    1
    $ pip install celery

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

    1
    $ pip install -"celery[redis]"

    写应用程序

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

    1
    2
    3
    4
    5
    6
    7
    from celery import Celery
     
    app = Celery('tasks', broker='redis://localhost:6379/0')
     
    @app.task
    def add(x, y):
        return + y

    运行worker

    在命令行中运行:

    1
    $ celery -A tasks worker --loglevel=info

    输出如下:

    1
    2
    3
    4
    [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环境:

    1
    2
    >>> from tasks import add
    >>> add.delay(44)

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

    1
    2
    [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.000579041981837s8

    存储结果

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

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

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

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

    可以查看Redis中的存储:

    1
    2
    3
    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做更进一步的了解,请参考官方文档

  • 相关阅读:
    [HAOI2015][bzoj 4033]树上染色(树dp+复杂度分析)
    20190716NOIP模拟赛T1 礼物(概率dp+状压)
    20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)
    延迟载入Dll(动态载入Dll)
    Dll重定向(尚存否?)
    delete和delete[] 区别
    06 序列号保护 学习分析(字符串)
    05 初识加壳脱壳
    04 复制删除行为IDA反汇编
    03 复制行为动态分析
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/8434752.html
Copyright © 2020-2023  润新知