一、介绍
celery–异步调度
celery–功能完备即插即用的任务队列
celery适用于异步处理问题,比如发送邮件、文件上传、图像处理等比较耗时的操作。
二、特点
简单–易于使用和维护,有丰富的文档
高效–单个celery进程每分钟可以处理数百万哥任务
灵活–celery中几乎每个部分都可以自定义扩展
三、安装
pip install celery
四、组成
Celery通过消息进行通信,通常使用一个叫broker(中间人)来协client(任务的发出者)和worker(任务的处理者)
client发出消息到队列中,broker将队列中的信息派发给worker来处理
一个Celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能
Celery组成结构是生产者消费者模型的一种体现
五、使用
1.首先创建一个celery实例
创建文件tasks.py
这里celery的第一个参数是当前文件(模块)的名字,这是必须的,以便当任务被定义在_main_模块时名字可以被自动生成
第二个参数是中间人键值参数,指定你想要使用的消息中间人URL.这里我们使用RabbitMQ (这也是默认选项)。你也可以选择其它中间人。对于RabbitMQ你可以用amqp://localhost,对于Redis 可以用redis://localhost。
这里定义了一个任务名叫add,返回两个值的和
2.运行celery worker服务
celery -A tasks worker --loglevel=info
3.调用任务
调用任务可以用delay()方法
这是apply_async()方法的方便的快捷方式,apply_async()拥有任务执行的更多的控制
这里相当于直接把参数传给上面咱们创建的函数,也就是celery的worker
4.保存结果
如果你想保存任务状态, Celery 需要把状态存储或发送到某个地方。有几个内建结果后端可供选择: SQLAlchemy/Django ORM, Memcached, Redis, RPC(RabbitMQ/AMQP)
这个例子我们使用 redis 结果后端, 它把状态作为临时消息发送回来。后端通过 backend 参数 指定给Celery
现在结果后端配置好了,再次调用
result = add.delay(4, 4)
无论任务是否接受处理,ready()方法都会有返回
----> result.ready()
----> False
你可以等待结果的完成, 但这很少使用,因为它把异步调用变成了同步:
----> result.get(timeout=1)
----> 8
为了应对任务可能抛异常,get()将会再次抛异常,但你可以通过指定propagate参数来覆盖
----> result.get(propagate=False)