如何在Django中为Celery队列设置特定代理?

时间:2014-01-31 01:43:43

标签: django redis celery amqp

我正在尝试将当前资源密集型视频处理队列移动到单独的代理。我将默认代理网址设置为使用AMQP:

BROKER_URL = 'amqp://defaultaddress/'

我的新经纪人正在使用Redis:

VIDEO_BROKER_URL = 'redis://videoaddress/'

如何设置“视频”队列以使用VIDEO_BROKER_URL而不是默认的BROKER_URL?

我已经阅读了Celery文档中的Routing Tasks,但我没有看到更改代理的任何内容。

2 个答案:

答案 0 :(得分:4)

首先,在django-celery中似乎是不可能的,因为每个django实例(项目)只有一个芹菜应用程序实例。但是现在django-celery已经被弃用了,在celery和django集成的新概念中,你实际上可以解决你的问题:

你必须创建两个不同的芹菜应用程序

<强>公共/ celery.py

from __future__ import absolute_import
from celery import Celery

app = Celery('common',
             broker='amqp://',
             include=['common.tasks'])

if __name__ == '__main__':
    app.start()

<强>公共/ tasks.py

from __future__ import absolute_import
from common.celery import app


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

视频/ celery.py

from __future__ import absolute_import
from celery import Celery

app = Celery('video',
             broker='redis://',
             include=['video.tasks'])

if __name__ == '__main__':
    app.start()

视频/ tasks.py

from __future__ import absolute_import
from video.celery import app


@app.task
def decode_video(path, from_format, to_format):
    # do something

现在您可以从django项目导入这两个应用程序。例如:

from video.tasks import decode_video
from common.tasks import add

def some_view_function(request):
    x = add.delay(2, 2)
    decode_video.apply_async(('/1/2/3/video.mp4', 'mp4', 'avi'), countdown=5)
    # return something

希望它会有所帮助。

答案 1 :(得分:0)

所以在做了一些搜索后,我发现了这个:

from kombu import BrokerConnection

...

video_connection = BrokerConnection(settings.VIDEO_BROKER_URL)
process_video.apply_async(arg=[video_pk], connection=video_connection)

我的初步测试似乎正在运行,因为我的本地celeryd实例没有完成任务。