Python - Django分布式Celery使用
Max.Bai
2016-05-16
Celery erlang开发,需要安装erlang。
Celery 需要消息队列配合使用,RabbitMQ, Redis都可以
如果是使用的django 需要安装 django-celery
Flower 是celery的监控工具
Worker 需要额外安装task执行的时候的需要包,比如,requests.
+ /Django/
+ /ProjectName/
/celery.py
+ /Application
/task.py
要放在工程的目录,比如:/ProjectName/celery.py
第一种:
task.delay
第二种:
task.aplly_async
可以指定task放到哪个队列里面 queue="xxx"
指定错误处理 link_error
其他方式参见Celery官网:http://www.celeryproject.org/
-Q 为队列名称,不指定执行所有队列的任务,指定后只执行指定的消息队列任务
-n 设置worker名字
开启后默认端口5555可以访问,监控各个worker
Max.Bai
2016-05-16
Django分布式Celery使用
1. 安装
pyhon 环境是必须的Celery erlang开发,需要安装erlang。
Celery 需要消息队列配合使用,RabbitMQ, Redis都可以
apt-get install erlang
apt-get install rabbitmq-server
pip install celery
apt-get install sqlite
pip install sqlalchemy
如果是使用的django 需要安装 django-celery
pip install django-celery
Flower 是celery的监控工具
pip install flower
Worker 需要额外安装task执行的时候的需要包,比如,requests.
2. Django配置Celery
假设工程目录如下:+ /Django/
+ /ProjectName/
/celery.py
+ /Application
/task.py
2.1. celery.py 文件
Celery.py 文件主要用来设置celery要放在工程的目录,比如:/ProjectName/celery.py
from __future__ import absolute_import
from celery import Celery
from kombu import Queue, Exchange
import os
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'testplatform.settings')
# set message queue and tasks list
app = Celery('interface',
broker='amqp://guest:guest@192.168.143.133:5672//',
backend='amqp://guest:guest@192.168.143.133:5672//',
include=['Application.tasks'])
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
# Optional configuration, see the application user guide.
app.conf.update(
CELERY_TASK_RESULT_EXPIRES=60,
CELERY_TASK_SERIALIZER='json',
CELERY_ACCEPT_CONTENT=['json'], # Ignore other content
CELERY_RESULT_SERIALIZER='json',
CELERY_TIMEZONE='Asia/Shanghai',
CELERY_ENABLE_UTC=True,
CELERY_QUEUES=(
Queue('Env_Testing', Exchange('run'), routing_key='run.Testing'),
Queue('Env_Regression', Exchange('run'), routing_key='run.Regression'),
),
CELERY_DEFAULT_QUEUE='default',
CELERY_DEFAULT_EXCHANGE='default',
CELERY_DEFAULT_EXCHANGE_TYPE='direct',
CELERY_DEFAULT_ROUTING_KEY='default',
CELERY_TRACK_STARTED=True,
)
if __name__ == '__main__':
app.start()
2.2. task.py 文件
task.py文件是task的内容,需要执行的代码,放在对应的application目录下, 比如:/Appliction/task.pyfrom __future__ import absolute_import
from ProjectName.celery import app
from celery.result import AsyncResult
@app.task
def task1(ID):
return task1(ID, "key")
@app.task
def task2(ID):
run_task(ID)
@app.task
def error_handler(uuid):
result = AsyncResult(uuid)
exc = result.get(propagate=False)
print('ERROR:Task {0} raised exception: {1!r}\n{2!r}'.format(
uuid, exc, result.traceback))
2.3. task执行
如何调用task?第一种:
task.delay
result = task1.delay(8, 8)
result.wait() # wait for and return the result
第二种:
task.aplly_async
可以指定task放到哪个队列里面 queue="xxx"
指定错误处理 link_error
from InterfaceFrameWork.tasks import task1, task2, error_handler
re = task1.apply_async(args="123", queue="QueueName", link_error=error_handler.s())
result = re.get(timeout=60)
其他方式参见Celery官网:http://www.celeryproject.org/
3. 启动Celery worker
启动Celery之前确保消息队列服务已经开启。celery -A ProjectName.celery:app worker -l info -Q Env_Regression -n work1@M11
-Q 为队列名称,不指定执行所有队列的任务,指定后只执行指定的消息队列任务
-n 设置worker名字
4. 启动Flower
启动Flower之前确保消息队列服务已经开启。cd Django
flower -A ProjectName.celery:app
开启后默认端口5555可以访问,监控各个worker
http://192.168.140.121:5555/#/
其他内容参见Celery官网:http://www.celeryproject.org/