官网地址 | http://celeryproject.org/ |
开发语言 | Python |
开源licence | BSD |
运行OS环境 | 跨平台 |
celery(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。
celery用于生产系统每天处理数以百万计的任务。
celery是用Python编写的,但该协议可以在任何语言实现。它也可以 与其他语言 通过webhooks实现。
建议的消息代理 RabbitMQ 的,但提供有限 支持 Redis , Beanstalk , MongoDB , CouchDB , ,和数据库( 使用SQLAlchemy 的 或Django的 ORM) 。
celery是易于集成Django, Pylons and Flask,使用 django-celery , celery-pylons and Flask-Celery 附加包即可。
例子:
两个数相加的例子:
from celery.task import task @task def add(x, y): return x + y
你可以后台运行,或者等待它完成:
>>> result = add.delay(8, 8)
>>> result.wait() # wait for and return the result 16
Celery+RabbitMQ快速入门
本文主要介绍Celery+RabbitMQ的入门知识
Celery 是一个异步任务队列/基于分布式消息传递作业队列,它侧重于实时操作,同样也支持调度 RabbitMQ为应用程序提供了强大的消息服务。它很容易使用,适合在云规模应用,并支持所有主流的操作系统和开发平台。RabbitMQ在Mozilla公共许可下开源
安装Celery
使用easy_install安装
sudo easy_install celery
安装RabbitMQ
在ubuntu下使用apt-get方式安装rabbitmq-server
sudo apt-get install rabbitmq-server
安装完毕之后可以使用如下命令查看MQ当前服务状态
alex@alex-pc:~/test$ sudo rabbitmqctl status [sudo] password for alex: Status of node 'rabbit@alex-pc' ... [{running_applications,[{rabbit,"RabbitMQ","1.7.2"}, {mnesia,"MNESIA CXC 138 12","4.4.12"}, {os_mon,"CPO CXC 138 46","2.2.4"}, {sasl,"SASL CXC 138 11","2.1.8"}, {stdlib,"ERTS CXC 138 10","1.16.4"}, {kernel,"ERTS CXC 138 10","2.13.4"}]}, {nodes,['rabbit@alex-pc']}, {running_nodes,['rabbit@alex-pc']}] ...done.
使用
配置celery
选择一个测试目录,在当前路径下新建配置文件celeryconfig.py,如下:
import sys import os sys.path.insert(0, os.getcwd()) CELERY_IMPORTS = ("tasks", ) CELERY_RESULT_BACKEND = "amqp" BROKER_HOST = "localhost" BROKER_PORT = 5672 BROKER_USER = "guest" BROKER_PASSWORD = "guest" BROKER_VHOST = "/
任务代码
新建tasks.py,如下:
from celery.task import task @task def add(x, y): return x + y
启动celery服务
在终端中使用如下命令:
alex@alex-pc:~/test$ celeryd --loglevel=INFO [2011-07-28 23:06:27,226: WARNING/MainProcess] -------------- celery@alex-pc v2.2.7 ---- **** ----- --- * *** * -- [Configuration] -- * - **** --- . broker: amqplib://guest@localhost:5672/ - ** ---------- . loader: celery.loaders.default.Loader - ** ---------- . logfile: [stderr]@INFO - ** ---------- . concurrency: 2 - ** ---------- . events: OFF - *** --- * --- . beat: OFF -- ******* ---- --- ***** ----- [Queues] -------------- . celery: exchange:celery (direct) binding:celery [Tasks] . tasks.add [2011-07-28 23:06:27,233: INFO/PoolWorker-1] child process calling self.run() [2011-07-28 23:06:27,235: INFO/PoolWorker-2] child process calling self.run() [2011-07-28 23:06:27,236: WARNING/MainProcess] celery@alex-pc has started.
调用
打开ipython或者任何python shell即可
In [8]: from celery.task import task In [9]: import tasks In [10]: res = tasks.add.delay(2,2) In [11]: res.ready() Out[11]: True In [12]: res.result Out[12]: 4
从celeryd的loginfo的输出信息中可以看到调用成功:
[2011-07-28 23:06:39,081: INFO/MainProcess] Got task from broker: tasks.add[82d8c609-2cac-47e8-be20-eb6a2dc502d6] [2011-07-28 23:06:39,120: INFO/MainProcess] Task tasks.add[82d8c609-2cac-47e8-be20-eb6a2dc502d6] succeeded in 0.0137050151825s: 4
转自:http://www.zeuux.com/blog/content/3938/
转载请注明:jinglingshu的博客 » celery 异步任务队列 (python)