最新消息:

celery 异步任务队列 (python)

Python admin 5105浏览 0评论
官网地址 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)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址