Python 如何在芹菜中的队列之间切换任务
我在芹菜的Python 如何在芹菜中的队列之间切换任务,python,multithreading,celery,message-queue,django-celery,Python,Multithreading,Celery,Message Queue,Django Celery,我在芹菜的tasks.py中有几个任务 # this should go to the 'math' queue @app.task def add(x,y): uuid = uuid.uuid4() result = x + y return {'id': uuid, 'result': result} # this should go to the 'info' queue @app.task def notification(calculation):
tasks.py
中有几个任务
# this should go to the 'math' queue
@app.task
def add(x,y):
uuid = uuid.uuid4()
result = x + y
return {'id': uuid, 'result': result}
# this should go to the 'info' queue
@app.task
def notification(calculation):
print repr(calculation)
我想做的是将这些任务放在一个单独的芹菜队列中,然后在每个队列上分配一些工作人员
问题是,我不知道如何在代码中将任务从一个队列放置到另一个队列
因此,例如,当一个add
任务完成执行时,我需要一种方法将生成的python字典放入info
队列中,以便进一步处理。我该怎么做
提前谢谢
编辑-澄清-
正如我在评论中所说,问题本质上变成了工人如何将从队列a
检索到的数据放置到队列B
您可以这样尝试
无论在何处调用任务,都可以将任务分配给哪个队列
add.apply_async(queue="queuename1")
notification.apply_async(queue="queuename2")
通过这种方式,您可以将任务放在单独的队列中
独立队列的工作人员
celery -A proj -Q queuename1 -l info
celery -A proj -Q queuename2 -l info
但您必须知道,默认值
队列是芹菜
。因此,如果任何未指定队列名称的任务
将转到芹菜
队列。因此,如果有类似情况,则需要使用芹菜
celery -A proj -Q queuename1,celery -l info
获取您期望的答案
如果要将一个任务的结果传递给另一个任务,则
result = add.apply_async(queue="queuename1")
result = result.get() #This contain the return value of task
然后
芹菜任务对象附带了
apply\u async
方法,可通过指定队列参数eggetSystemInfo.apply\u async(queue=queueList[i])来指定要将任务发送到的队列
您还可以通过添加-Q选项,例如--app=dir.app--loglevel=INFO-Q,让工作人员只监听特定队列。一旦所有这些都完成了,您只需要一些内部的簿记,就可以了解哪个队列得到了什么任务``@cmidi。但本质上,问题是工作人员如何将从队列a
检索到的数据放置到队列B
…这就是我没有将其作为答案的原因,我不清楚问题的确切含义。任务总是一个接一个地运行,还是可以在不同的任务上同时运行?您是希望将一个运行任务的结果提供给另一个运行任务,还是希望获得参数?@cmidi您是对的。任务应在不同队列上异步并发运行。通知
任务不必等待添加
结果。但是,add
应该能够将某些内容发布到通知
的队列中,以便其工作人员能够拾取并最终显示它。是的,但是数据传输将如何进行?我的意思是queuname2
将如何检索返回的字典(在我的示例中是从queuename1
)?很好。还有一件事:有没有办法保存任务id
?举个例子,如果这个result
可以在整个处理周期中保持相同的id
,那就太好了。result.id
会给你一些提示,但是如果我稍微将你的最后一行代码改成这个result2=notification.apply_async(args=[result],queue=“queuename2”)
,然后,result2.id
将与result.id
不同。不,它不能。如果您希望这样,您必须使用自定义任务id。
notification.apply_async(args=[result], queue="queuename2")