我在两台机器上有两个芹菜节点(n1,n2),我的任务入队在另一台机器(主机)上。 主机可能不知道可用的节点名称。 我的问题是,是否可以保证一系列任务将在单个节点上运行。
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()
或者这仍然会将任务发送到消息队列并导致同样的问题吗?
答案 0 :(得分: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执行。
文档:http://celery.readthedocs.org/en/latest/userguide/routing.html#manual-routing