关闭

Celery使用快速入门

标签: celery消息队列
140人阅读 评论(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
查看评论

Celery(一)---------使用Celery的第一步

1.什么是任务队列? 2.你需要知道的 Celery需要一个消息通道来发送和接收消息。RabbitMQ和Redis中间人通道是目前支持的特性。但是Celery也支持很多其它正在实验中的解决方案,如使用SQLite做本地开发。 Celery可以运行在一台或多台机器上,甚至可以运行在不同的数据中心上...
  • happyAnger6
  • happyAnger6
  • 2016-05-14 19:18
  • 10598

在 Flask 中使用 Celery

在 Flask 中使用 Celery 后台运行任务的话题是有些复杂,因为围绕这个话题会让人产生困惑。为了简单起见,在以前我所有的例子中,我都是在线程中执行后台任务,但是我一直注意到更具有扩展性以及具备生产解决方案的任务队列像 Celery 应该可以替代线程中执行后台任务。 ...
  • sedrtse
  • sedrtse
  • 2016-12-11 11:07
  • 657

Celery(二)-----------------使用Celery的第二步

使用Celery的第一步是有意最小化的介绍Celery。本节教程将为你展示Celery提供的更多细节,包括怎样为你的程序和库添加Celery支持。 本节教程不会介绍Celery的所有特性和最佳实践,所以建议你也阅读一下用户指引 User Guide。 在你的程序中使用Celery 我们工程的结...
  • happyAnger6
  • happyAnger6
  • 2016-05-15 19:52
  • 7789

celery使用入门

项目最近要开始使用celery,于是开始学习点ru
  • suoluoji
  • suoluoji
  • 2014-06-28 13:01
  • 2311

Celery源码分析(三)---------Blueprint

上一节讲到任务执行单元Worker主要维护了一个Blueprint对象,Worker的启动主要就是启动Blueprint对象,这一节我们来详细看下Blueprint. 首先,还是先看下时序流程图: 结合时序图进行分析: 1.在Worker调用setup_inst...
  • happyAnger6
  • happyAnger6
  • 2016-12-26 22:41
  • 899

Celery 踩坑笔记

看教程里经常出现的那个魔法般的from task import add实际上只是同目录下对于模块的引用。因为 @app.task 修改后的对象和原函数对象一样,都可以直接调用,也都是调用本地方法。不同的是添加了 Celery 自己的方法,比如 delay,调用这些方法就是走 Celery 的流程了。...
  • shellpaul
  • shellpaul
  • 2016-07-11 10:05
  • 557

菜鸟搭建celery环境

python celery
  • goodzyw
  • goodzyw
  • 2016-01-14 19:43
  • 1252

异步任务神器 Celery 快速入门

简介在程序运行过程中,要执行一个很久的任务,但是我们又不想主程序被阻塞,常见的方法是多线程。可是当并发量过大时,多线程也会扛不住,必须要用线程池来限制并发个数,而且多线程对共享资源的使用也是很麻烦的事情。还有协程,但是协程毕竟还是在同一线程内执行的,如果一个任务本身就要执行很长时间,而不是因为等待I...
  • xsj_blog
  • xsj_blog
  • 2017-03-27 23:50
  • 479

【Python】基于Celery的分布式应用

架构安装Celery pip install celery 编写Task-Func#-*-coding:utf-8-*- #download.pyfrom celery import Celery import urllibapp = Celery('download', broke...
  • ns2250225
  • ns2250225
  • 2016-03-24 20:58
  • 1900

Celery分布式任务队列快速入门

一  Celery介绍和基本使用     需求场景 1.  对100台命令执行一条批量命令,命令执行需要很长时间,但是不想让主程序等着结果返回,而是给主程序返回一个任务ID,task_id 主程序过一段时间根据task...
  • qq_15037231
  • qq_15037231
  • 2018-01-26 15:55
  • 50
    个人资料
    • 访问:9434次
    • 积分:358
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:5篇
    • 译文:14篇
    • 评论:3条