Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32355
  • 博文数量: 54
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-18 16:09
文章分类

全部博文(54)

文章存档

2015年(3)

2014年(36)

2013年(15)

我的朋友

分类: Python/Ruby

2015-09-05 11:06:46

遇到了这样的需求,接口数据需要第三方接口的数据返回,但第三方接口数据不是实时返回的,查找了下,发现分布式任务队列celery可以满足需求。
Celery架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store),这里我是用RabbitMQ作为message broker。

部署环境如下:
Ubuntu 14.04
1. 安装rabbitmq-server。
#sudo apt-get install rabbitmq-server
2. 安装celery
#sudo apt-get install celery
3. 安装django-celery
#pip install django-celery
4. 创建测试应用程序
$ django-admin.py startproject celerytest
$ cd celerytest
$ django-admin.py startapp hello
$ cd hello
5. 修改settings,在INSTALLED_APPS下加入:
INSTALLED_APPS = (
  ...
  'djcelery',          # 加入celery
  'hello',             # 测试应用程序
}
在settings末尾加入RabbitMQ的配置:
import djcelery
djcelery.setup_loader()

BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_URL = "amqp://guest:guest@localhost:5672//"

6. 创建celery所需的表
python manage.py syncdb

7. 创建hello/tasks.py:

from celery.decorators import task

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


8. 运行celery worker:
python manage.py celeryd -l info
运行到这里会报出Segmentation fault的错误。是因为python-librabbitmq版本太低,使用命令“sudo apt-get remove  python-librabbitmq"
删除系统原来的包,celery会使用python-amqp包的。

9.新打开个控制台:
$ python manage.py shell
>>> from hello.tasks import add
>>> r = add.delay(3,5)     # 执行这一行就能在worker的日志中看到运行状况
>>> r.wait()
8


10. 运行celeryd终端的log信息
[2015-09-05 02:19:27,793: INFO/MainProcess] Received task: hello.tasks.add[78c3145d-c04b-4831-8461-23ab9b11e9d8]
[2015-09-05 02:19:27,962: INFO/MainProcess] Task hello.tasks.add[78c3145d-c04b-4831-8461-23ab9b11e9d8] succeeded in 0.139714299s: 8

阅读(1004) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~