2015-04-01 83 views
0

我在Celery的tasks.py中有几项任务。如何在Celery中的队列之间切换任务

# 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队列中以进一步处理。我应该怎么做?

在此先感谢。

编辑-CLARIFICATION-

正如我在评论中说,这个问题从本质上变成如何检索从queue Aqueue B工人的地方的数据。

+0

芹菜任务对象自带的' apply_async'方法,它可以用来指定你想发送t的队列通过指定队列参数来请求,例如'getSystemInfo.apply_async(queue = queueList [i])' 您可以让工作人员只通过添加-Q选项来侦听特定队列,例如'--app = dir.app --loglevel = INFO -Q '。一旦完成了这一切,你只需要一些内部的书籍来了解哪个队列得到什么任务 '' – cmidi 2015-04-01 15:19:21

+0

@cmidi足够公平。但本质上,问题是工作人员如何将数据从'队列A'检索到'队列B'...... – kstratis 2015-04-01 15:22:15

+0

这就是我没有把它作为答案的原因,我不清楚这个问题到底是什么。这些任务是否会一个接一个地运行,还是可以在不同的队列中同时运行?你想从一个运行任务的结果提供给另一个,或者你想参数? – cmidi 2015-04-01 15:31:10

回答

1

你可以试试这个。

无论您何时调用任务,都可以将任务分配到哪个队列。

add.apply_async(queue="queuename1") 

notification.apply_async(queue="queuename2") 

通过这种方式,你可以把任务放在单独的队列中。

工人的独立队列

celery -A proj -Q queuename1 -l info 

celery -A proj -Q queuename2 -l info 

但你必须知道,default队列celery。所以,如果不指定queue name将转到celery queue.So需要一种celery消费者任何任务,如果有喜欢的。

celery -A proj -Q queuename1,celery -l info 

为了您预期的答案

如果你想一个任务的结果传递给another.Then

result = add.apply_async(queue="queuename1") 
result = result.get() #This contain the return value of task 

然后

notification.apply_async(args=[result], queue="queuename2") 
+0

是的,但数据传输将如何发生?我的意思是'queuname2'如何检索返回的字典(从我的例子中的'queuename1')? – kstratis 2015-04-01 15:27:07

+0

更新了答案 – itzMEonTV 2015-04-01 16:09:58

+0

太好了。还有一件事:有没有办法保存任务'id'?给你一个例子,如果这个'result'在整个处理周期中都能保持相同的'id',那将是非常棒的。 – kstratis 2015-04-01 16:17:03