Celery 使用简介
转自:http://liuzxc.github.io/blog/celery/
Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,它是一个专注于实时处理的任务队列, 同时也支持任务调度。Celery 中有两个比较关键的概念:
- Worker: worker 是一个独立的进程,它持续监视队列中是否有需要处理的任务;
- Broker: broker 也被称为中间人或者协调者,broker 负责协调客户端和 worker 的沟通。客户端向 队列添加消息,broker 负责把消息派发给 worker。
安装 Celery
直接使用 python 工具 pip 或者 easy_install 来安装:
$ pip install celery
安装 Broker
celery 支持多种 broker, 但主要以 RabbitMQ 和 Redis 为主,其他都是试验性的,虽然也可以使用, 但是没有专门的维护者。在 RabbitMQ 和 Redis之间,我们该如何选择呢?
RabbitMQ is feature-complete, stable, durable and easy to install. It’s an excellent choice for a production environment.
Redis is also feature-complete, but is more susceptible to data loss in the event of abrupt termination or power failures.
celery 官方明确表示推荐在生产环境下使用 RabbitMQ,Redis 存在丢数据的问题。所以如果你的业务可以容忍 worker crash 或者电源故障导致的任务丢失,采用 redis 是个不错的选择,本篇就以 redis 为例来介绍。
celery 对于 redis 的支持需要安装相关的依赖,以下命令可以同时安装 celery 和 redis 相关的依赖,但是 redis server 还是必须单独安装的。
$ pip install -U celery[redis]
# -U 的意思是把所有指定的包都升级到最新的版本
Celery 的配置和使用
Celery 本身的配置项是很多的,但是如果要让它跑起来,你只需要加一行配置:
BROKER_URL = 'redis://localhost:6379//'
这一行就是告诉 celery broker 的地址和选择的 redis db,默认是 0。接下来用个很简单的例子来介绍 celery 是如何使用的:
# task.py
from celery import Celery
app = Celery('tasks', broker='redis://localhost//')
@app.task()
def add(x, y):
return x + y
我们创建了一个 celery 的实例 app,可以通过它来创建任务和管理 workers。在上面的例子中,我们创建了一个 简单的任务 task, 它返回了两个数相加后的结果。
接下来运行 celery worker,通过它来监听是否有任务要处理。
$ celery -A task worker
通过 celery worker –help 查看更多参数选项
然后我们再打开一个 shell 窗口,进入 python 控制台去调用 add 任务:
>>> from task import add
>>> add.delay(1, 2)
<AsyncResult: 42ade14e-c7ed-4b8d-894c-1ca1ec7ca192>
delay 是 apply_async 的简写,用于一个任务消息(task message)。我们发现 add 任务并没有返回 3,而是 一个对象 AsyncResult,它的作用是被用来检查任务状态,等待任务执行完毕或获取任务结果,如果任务失败,它会返回 异常信息或者调用栈。
我们先尝试获取任务的执行结果:
>>> result = add.delay(1, 2)
>>> result.get()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/celery/result.py", line 169, in get
no_ack=no_ack,
File "/usr/local/lib/python2.7/dist-packages/celery/backends/base.py", line 604, in _is_disabled
'No result backend configured. '
NotImplementedError: No result backend configured. Please see the documentation for more information.
报错了: No result backend configured. 错误信息告诉我们没有配置 result backend。因为 celery 会将任务的 状态或结果保存在 result backend,result backend 的选择也有很多,本例中我们依然选用 redis 作为 result backend。
我们修改 task.py 的代码,添加上 result backend 的设置,保存后重启 celery worker。
# task.py
...
app = Celery('tasks', backend='redis://localhost', broker='redis://localhost//')
...
然后重新调用 add task,看看我们是否获取到了执行结果?
>>> from task import add
>>> result = add.delay(1,2)
>>> result.get()
3
我们正确的获得到了结果!怎么样, celery 的使用是不是很简单呢?
Celery Flower
flower 是一个 celery 的监控工具,它提供了一个图形用户界面,可以极大的方便我们监控任务的执行过程, 执行细节及历史记录,还提供了统计功能。
flower 安装
$ pip install flower
or:
$ easy_install flower
flower 使用简介
首先启动通过命令行启动 flower 进程:
$ flower -A proj --port=5555
然后打开浏览器 http://localhost:5555/
Celery 任务类型
apply_async
调用一个异步任务,这也是最常用的任务类型之一,delay 与它的作用相同,只是 delay 不支持 apply_async 中额外的参数。该方法有几个比较重要的参数,在实际应用中会经常用到:
- countdown: 任务延迟执行的秒数,默认立即执行;
- eta:任务被执行的绝对时间
crontab
celery 同样也支持定时任务:
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
# Executes every Monday morning at 7:30 A.M
'add-every-monday-morning': {
'task': 'tasks.add',
'schedule': crontab(hour=7, minute=30, day_of_week=1),
'args': (16, 16),
},
}
要启动定时任务,需要启动一个心跳进程:
$ celery -A proj beat
Celery 使用简介的更多相关文章
- Python之celery的简介与使用
celery的简介 celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度.它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能 ...
- Python Celery队列
Celery队列简介: Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery. 使用 ...
- Python爬虫之使用celery加速爬虫
celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度.关于celery的更多介绍及例子,笔者可以参考文章Python之celery的简介与使用. 本文将介绍 ...
- python之celery队列模块
一.celery队列简介 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery. 1 ...
- 【理论】python使用celery异步处理请求
Flask中使用celery队列处理执行时间较长的请求. 一. 安装celery pip install celery flask redis 二. celery简介 Celery是个异步分布式任务队 ...
- celery简介
目录 Celery简介 Celery架构 中间件选择 Celery序列化 简单项目 Celery简介 celery userguide 知乎大神解释celery Celery(芹菜)是基于Python ...
- Celery简介以及Django中使用celery
目录 Celery简介 消息中间件 任务执行单元 任务结果存储 使用场景 Celery的安装和配置 Celery执行异步任务 基本使用 延时任务 定时任务 异步处理Django任务 案例: Celer ...
- celery(一)分布式任务调度模块简介及运行环境
Celery是Python开发的分布式任务调度模块. Celery本身不含消息服务,它使用第三方消息服务来传递任务. django下有个分支Django-Celery,可以结合django来实现任务的 ...
- Python 任务队列 Celery
一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.. 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据 ...
随机推荐
- OpenJudge计算概论-鸡尾酒疗法
/*===================================== 鸡尾酒疗法 总时间限制: 1000ms 内存限制: 65536kB 描述 鸡尾酒疗法,原指“高效抗逆转录病毒治疗”(HA ...
- mysql 多行合并一列
mysql 多行合并一列 使用的函数为: GROUP_CONCAT(exp) 其中exp 的参数类似如下: (field order by field desc separator ';') ...
- github 添加 C# IGNORE
在创建仓库时选择 VisualStudio 即可.
- SPOJ #692. Fruit Farm
Another palindrome related problem. Actually nothing too theoretical here, but please keep following ...
- Linux下SSH的Log文件路径
Redhat or Fedora Core: /var/log/secure # Mandrake, FreeBSD or OpenBSD: /var/log/auth.log # SuSE: /va ...
- (C#) What is the difference between "const" and "static readonly" ?
const int a must be initialized initialization must be at compile time readonly int a can use defaul ...
- Platform Invoke
PInvoke 允许managed code 来调用在DLL中实施的unmanged function. Platform invoke relies on metadata to locate ex ...
- [jQuery]《锋利的jQuery》插件部分总结
/** * <锋利的jQuery>插件部分总结 * * jQuery插件推荐命名:jquery.name.js * * $.fn.extend用于封装对象方法的插件 * $.extend用 ...
- JDK1.7新特性
jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...
- OAF_架构MVC系列3 - View的概述(概念)
2014-06-18 Created By BaoXinjian