2015-05-09 100 views
1

我在两台机器上有两个芹菜节点(n1,n2),我的任务入队在另一台机器上(主)。 主机可能不知道可用的节点名称。 我的问题是,是否有任何保证任务链将在单个节点上运行。Python芹菜在单个节点上的任务链

res = chain(generate.s(filePath1, filePath2), mix.s(), sort.s()) 

问题是各种任务都使用本地数据文件,这些文件是特定于节点的。 我的猜测是,链可能是和弦,文档明确表示,不能保证在单个节点上运行。 如果我对链条的猜测是正确的,那么我的下一个问题是,以下是链接的替代方案的一个很好的解决方案吗?

单任务=保证单个节点

@app.task 
def my_chain_of_tasks(): 
    celery.current_app.send_task('mymodel.tasks.generate', args=[filePath1, filePath2]).get() 
    celery.current_app.send_task('mymodel.tasks.mix').get() 
    # do these 2 in parallel: 
    res1 = celery.current_app.send_task('mymodel.tasks.sort') 
    res2 = celery.current_app.send_task('mymodel.tasks.email_in_parallel') 
    res1.get() 
    return res2.get() 

,或者这是仍然要任务发送到消息队列和导致同样的问题?

回答

2

您正在调用.get()对另一个反作用内的任务内的任务。也不保证所有这些任务将在单个节点上执行。

如果您希望特定节点执行一些任务,您可以对它们进行排队或相应地路由它们。现在

CELERY_ROUTES = { 
    'mymodel.task.task1': {'queue': 'queue1'}, 
    'mymodel.task.task2': {'queue': 'queue2'} 
} 

你就可以开始两个工人来消耗他们

celery worker -A your_proj -Q queue1 
celery worker -A your_proj -Q queue2 

现在所有task1将由worker1和task2通过worker2执行。

Docs:http://celery.readthedocs.org/en/latest/userguide/routing.html#manual-routing

+0

我有点困惑。我可以在主机上指定CELERY_ROUTES吗?主机不运行芹菜。它只是排队消息队列中的任务。 – max

+0

那很好。你可以在celery配置文件中指定路由。当您在远程计算机上运行worker时,它只会消耗来自代理 – ChillarAnand

+0

的相关任务,谢谢。让我想出一个设置来尝试一下;那么我会标记你的答案。 – max