关闭

Celery使用快速入门

标签: celery消息队列
110人阅读 评论(0) 收藏 举报
分类:

应用(Application)

首先需要一个Celery实例。可以把它叫Celery应用,或直接简略为app。你想要在celery里做的,像创建任务,管理工人(workers),都要以这个实例为入口点。其它模块一定有导入它的可能。

在这个教程中,我们让一切都包含在一个模块中,但对于一个更大的项目,你得创建分开的模块。

创建一个文件 tasks.py:

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

给Celery的第一个参数是当前模块的名字。这是不可缺少的以便于当任务被定义在__main__ 模块时名字可以被自动生成。

第二个参数是中间人键值参数,指定你想要使用的消息中间人URL.这里我们使用RabbitMQ (这也是默认选项)。你也可以选择其它中间人。对于RabbitMQ你可以用amqp://localhost,对于Redis 可以用redis://localhost。

我们定义了一个任务add,返回两个值的和。

运行Celery worker 服务
现在可以通过使用worker 参数执行我们的程序,可以运行 worker :

$ celery -A tasks worker --loglevel=info

注意
如果worker没有启动,请参看官网Troubleshooting部分
在生产环境你将会在后台作为守护进程运行worker。这样你就需要使用你的平台上提供的工具,或者像supervisord之类的东西(查看官网Daemonization部分获得更多信息)

查看可用的命令行选项完整清单:

$  celery worker --help

还要其他几种可用的命令,help也是可用的::

$ celery help

调用任务

调用任务可以用 delay() 方法。
这是apply_async() 方法的方便的快捷方式,apply_async() 拥有任务执行的更多的控制。 (查看 Calling Tasks):

>>> from tasks import add
>>> add.delay(4, 4)

任务现在会被之前启动的worker处理。你可以查看worker的控制台输出来确认。

调用一个任务会返回 AsyncResult 实例。这可以用来检查任务状态,等待任务结束,或者获得它的返回值(或者如果任务失败,获取异常或堆栈跟踪)

结果没有被默认激活。为远程过程调用或者持久任务结果到一个数据库,你需要配置Celery来使用一个结果后端(backend)。下个部分会讨论。

保存结果

如果你想保存任务状态, Celery 需要把状态存储或发送到某个地方。有几个内建结果后端可供选择: SQLAlchemy/Django ORM, Memcached, Redis, RPC (RabbitMQ/AMQP), 或者你也可以定义你自己的。

这个例子我们使用 rpc 结果后端, 它把状态作为临时消息发送回来。后端通过 backend 参数 指定给Celery, (如果你选择使用一个配置模块,就通过 result_backend 设置):

app = Celery('tasks', backend='rpc://', broker='pyamqp://')

或者如果你想用 Redis 作为结果后端,但仍然使用RabbitMQ作为消息中间人(一个流行的组合):

app = Celery('tasks', backend='redis://localhost', broker='pyamqp://')

想要了解更多backends相关请参看 Result Backends.

现在结果后端配置好了,我们再次调用任务。这次你调用任务时会守住AsyncResult 实例返回:

>>> result = add.delay(4, 4)

无论任务是否接受处理,ready() 方法都会有返回:

>>> result.ready()
False

你可以等待结果的完成, 但这很少使用,因为它把异步调用变成了同步:

>>> result.get(timeout=1)
8

为了应对任务可能抛异常,get()将会再次抛异常,但你可以通过指定propagate参数来覆盖。:

>>> result.get(propagate=False)

如果任务抛出一个异常,你也可以访问初始的堆栈跟踪

>>> result.traceback
?

查看 celery.result了解完整的结果对象介绍。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7437次
    • 积分:335
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:5篇
    • 译文:14篇
    • 评论:3条