Python - Django分布式Celery使用

本文介绍如何在Django项目中集成Celery实现分布式任务处理,包括安装配置、任务定义及执行方法,并提供了启动Celery Worker及监控工具Flower的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python - Django分布式Celery使用
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.py

from __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/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值