Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在芹菜中的队列之间切换任务_Python_Multithreading_Celery_Message Queue_Django Celery - Fatal编程技术网

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
方法,可通过指定队列参数eg
getSystemInfo.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")