celery初探

        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


        

猜你喜欢

转载自blog.csdn.net/qq_29827369/article/details/80981219