单个节点上的Python芹菜任务链

单个节点上的Python芹菜任务链,python,celery,Python,Celery,我在两台机器(n1,n2)上有两个芹菜节点,我的任务队列在另一台机器(main)上。 主机可能不知道可用的节点名称。 我的问题是,是否可以保证任务链将在单个节点上运行 res = chain(generate.s(filePath1, filePath2), mix.s(), sort.s()) 问题在于,各种任务都在使用特定于节点的本地数据文件。 我的猜测是,链可能像和弦一样,文档明确表示,不能保证在单个节点上运行。 如果我对连锁店的猜测是正确的,那么我的下一个问题是,作为连锁店的替代品,以

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

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()

或者这仍然会将任务发送到消息队列并导致相同的问题?

您正在对另一个任务中的任务调用一个
.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执行


医生:

我有点困惑。我可以在主机上指定芹菜路径吗?主机没有运行芹菜。它只是将任务排在消息队列中。没关系。您可以在芹菜配置文件中指定路线。当您在远程计算机上运行worker时,它只消耗来自代理银行的相关任务。让我找出一个设置来尝试它;然后我将标记您的答案。问题是在您的示例中,我需要有不同的任务,但我的目标是在不同的队列上使用不同的参数运行相同的任务。有什么想法吗?然后你可以对参数和路由进行条件检查?