Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。它是一个专注于实时处理的任务队列,同时也支持任务调度。 Celery 有广泛、多样的用户与贡献者社区,可以通过IRC 或是 邮件列表 加入到 Celery 的开发和维护中。 Celery 是开源的,使用 BSD 许可证 授权。 下面就以两个 Celery 非常常用的例子:异步任务执行 和 定时任务 为例,给大家介绍一下如何使用 Celery。
安装celery:pip install Celery
Celery 原理简介
为了说明为什么需要预备环境,这里需要对 Celery 的原理进行一个简单的介绍,这里介绍的原理就是 Celery 是如何实现异步任务的。 Celery 的异步实现原理是将 任务执行单元 和 任务派发单元 分开,从而达到异步的效果;
任务派发单元 将需要执行的任务丢到一个 消息队列 中,然后由 任务执行单元 根据自身的情况从消息队列中获取任务执行,这样就实现了异步的效果。 所以,这里我们可以发现 3 个关键的单位,分别是 任务执行单元(worker/consumer)、任务派发单元(producer)和 消息队列(queue)。 consumer 和 producer 我们稍后再说,因为都是在 Celery 里面的,但是我们的 Celery 并不带 Queue,所以需要我们自己准备 Queue,Celery 官方推荐的 Queue 有 RabbitMQ、Redis,当然还有很多组件可以选择,但是 Celery 表示并不保证完美支持。这里就以 RabbitMQ 为例进行演示
异步队列 Demo
下面就演示一个很简单的异步队列,将以下代码保存为 tasks.py
:
from celery import Celery app = Celery("tasks", broker='amqp://127.0.0.1:15672//') @app.task def add(x, y): print "x+y=%d" % (x+y) return x+y
启动worker会出现以下输出
celery -A tasks worker -l info -------------- celery@WIN-UPK6DSRHAC7 v3.1.18 (Cipater) ---- **** ----- --- * *** * -- Windows-7-6.1.7601-SP1 -- * - **** --- - ** ---------- [config] - ** ---------- .> app: tasks:0x3bc7ef0 - ** ---------- .> transport: amqp://guest:**@127.0.0.1:15672// - ** ---------- .> results: disabled - *** --- * --- .> concurrency: 4 (prefork) -- ******* ---- --- ***** ----- [queues] -------------- .> celery exchange=celery(direct) key=celery [tasks] . tasks.add
这个时候,worker 已经启动了, queue 也已经存在了,就差 producer 了,我们这里决定使用 python shell 来作为 producer。 打开另外一个 shell 终端,切换到 tasks.py 所在的目录,然后运行以下命令:
>>> from tasks import add
>>> add.delay(1, 2)
此时到worker终端可以看到
[2018-07-10 12:33:04,450: WARNING/Worker-1] x+y=3
[2018-07-10 12:33:04,451: INFO/MainProcess] Task tasks.add[fd6c3ac0-51ca-4e65-810d-cbb98349434a] succeeded in 0.000999927520752s: 3
此时worker已经执行了
定时任务
from celery.schedules import crontab from celery import Celery app = Celery("tasks", broker="redis://127.0.0.1:6379/1") app.conf.update( # 定时配置要放在这里,f**k... CELERYBEAT_SCHEDULE={ 'perminute': { 'task': 'tasks.add', 'schedule': crontab(minute='*/1'), 'args': (1, 2) } } )
运行命令celery beat -A schedule -l info
在worker端就可以看到
2018-07-10 12:59:05,059: INFO/MainProcess] Task tasks.add[97438566-2a53-4e2b-b5fd-c11c3a71d480] succeeded in 0.0179998874664s: 3
[2018-07-10 13:00:00,019: INFO/MainProcess] Received task: tasks.add[639865cb-18d9-4a93-9549-a22130f7618b]
[2018-07-10 13:00:00,023: WARNING/Worker-1] x+y=3
[2018-07-10 13:00:00,036: INFO/MainProcess] Task tasks.add[639865cb-18d9-4a93-9549-a22130f7618b] succeeded in 0.0139999389648s: 3
[2018-07-10 13:01:00,005: INFO/MainProcess] Received task: tasks.add[e8fb7089-b726-4879-95f6-10928cd189dc]
[2018-07-10 13:01:00,007: WARNING/Worker-1] x+y=3
[2018-07-10 13:01:00,020: INFO/MainProcess] Task tasks.add[e8fb7089-b726-4879-95f6-10928cd189dc] succeeded in 0.0139999389648s: 3