我有芹菜任务,可能会排队其他子任务。如果工作人员从高优先级队列中提取该任务,然后该任务将其他任务排队,我希望新任务返回进入高优先级队列。但是,如何以编程方式获取当前正在执行的任务来自的队列?
我知道我可以做一些事情,例如传递一个额外的参数,到原始的my_task.apply_async()
调用,它指定一个用于子任务的队列,然后我可以通过方法/类的链传递它紧缩任务,但这看起来很混乱,很难维护。似乎只需要询问Celery就可以在某处获得队列信息。
答案 0 :(得分:2)
我发现队列信息可以通过current_task.request.delivery_info['exchange']
获得
所以,我最终使用的解决方案如下:
def get_source_queue(default=None):
"""
Finds and returns the queue that the currently-executing task (if any) came from.
"""
from celery import current_task
if current_task is not None and 'exchange' in current_task.request.delivery_info:
source_queue = current_task.request.delivery_info['exchange']
if source_queue is not None:
return source_queue
return default
然后我将它用于这样的子任务:
my_task.apply_async(args=('my', 'args'), queue=get_source_queue(default='foo_queue'))
我不知道这是否是最好的方式......也许有一些内置于芹菜中的东西说"使用与源队列相同的队列" (?)但是,上述工作。