我正在尝试将当前资源密集型视频处理队列移动到单独的代理。我将默认代理网址设置为使用AMQP:
BROKER_URL = 'amqp://defaultaddress/'
我的新经纪人正在使用Redis:
VIDEO_BROKER_URL = 'redis://videoaddress/'
如何设置“视频”队列以使用VIDEO_BROKER_URL而不是默认的BROKER_URL?
我已经阅读了Celery文档中的Routing Tasks,但我没有看到更改代理的任何内容。
答案 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实例没有完成任务。