Python 单个节点上的 Celery 任务链

Python Celery Chain of Tasks on a Single Node

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

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'}
}

现在你可以启动两个worker来消费它们

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