1. Celery 简介

Celery是一个自带电池的基于Python开发的分布式异步消息任务队列,它非常易于使用。通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用Celery。它主要适用于两大类场景:

  • 异步:
    有的任务执行时间较长,你不想让程序一直等待结果返回,可以先将改任务放入celery任务队列中,并从Celery获取一个任务ID。后续通过询问Celery来得知任务执行状态和进度。
  • 定时:
    需要定时执行同样的任务,Celery任务队列支持定时触发,可以按照时间间隔或者crontab表达式来触发任务。

Celery具有以下优点:

  • Simple(简单)
    Celery 使用和维护都非常简单,并且不需要配置文件。它有一个活跃、友好的社区,你可以去讨论问题、需求支持。包括一个mailing-list 和一个IRC channel.

这有一个最简单的应用示例,你可以参照:

from celery import Celery
    app = Celery('hello', broker='amqp://guest@localhost//')
    @app.task
    def hello():
          return 'hello world'
  • Highly Available(高可用)
    woker和client会在网络连接丢失或者失败时,自动进行重试。并且有的brokers 也支持“双主”或者“主/从”的方式实现高可用。

  • Fast(快速)
    单个的Celery进程每分钟可以处理百万级的任务,并且只需要毫秒级的往返延迟(使用 RabbitMQ, librabbitmq, 和优化设置时)

  • Flexible(灵活)
    Celery几乎每个部分都可以扩展使用,自定义池实现、序列化、压缩方案、日志记录、调度器、消费者、生产者、broker传输等等。

2. Celery基本工作流程

 
Celery基本工作流程

3. Celery安装

你可以安装Celery通过Python包管理平台(PyPI)或者源码安装
使用pip安装:

$ pip install -U Celery

你也可以使用pip命令安装与Celery捆绑、依赖的组件:

$ pip install "celery[librabbitmq]"
$ pip install "celery[librabbitmq,redis,auth,msgpack]"

4. Celery使用

4.1 Brokers

Celery支持多种消息中间件作为Broker,即中间人。来在应用程序和Worker之间传递消息。

支持的消息中间件总览:

消息中间件支持适配状态支持监控支持远程控制
RabbitMQ 稳定
Redis 稳定
Amazon SQS 稳定
Zookeeper 实验

RabbitMQ是默认的Broker它不需要其他额外的依赖和初始化配置。可参考我之前写的文章【RabbitMQ的Python客户端pika使用调研】和官方教程【Using RabbitMQ】,至于其他的消息中间件作为broker这里就不一一展开介绍了。

4.2 Worker

4.3 触发器

4.3.1 定时触发器

4.3.2 调用触发器

4.3 管理获取任务状态

http://docs.celeryproject.org/en/latest/userguide/tasks.html#states

4.4 backend

http://docs.celeryproject.org/en/latest/userguide/tasks.html#task-result-backends

4.5 与Flask框架集成

http://www.pythondoc.com/flask-celery/first.html#id1

4.6 与Django框架集成

 

踩过的一些坑

任务重复执行

使用 Celery Once 来防止 Celery 重复执行同一个任务

celery 在执行task时有个机制,就是任务时长超过了 visibility_timeout 时还没执行完,就会指定其他worker重新开始task,默认的时长是一小时.