【问题标题】:Python Celery Chain of Tasks on a Single Node单个节点上的 Python Celery 任务链
【发布时间】:2015-05-09 17:47:51
【问题描述】:

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

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

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

单个任务 = 保证单个节点

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

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

【问题讨论】:

    标签: python celery


    【解决方案1】:

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

    【讨论】:

    • 我有点困惑。我可以在主机上指定 CELERY_ROUTES 吗?主机没有运行celery。它只是在消息队列中排队任务。
    • 没关系。您可以在 celery 配置文件中指定路由。当你在远程机器上运行 worker 时,它只使用来自 broker 的相关任务
    • 谢谢。让我想出一个设置来尝试一下;然后我会标记你的答案。
    • 问题是在你的例子中,我需要有不同的任务,但我的目标是在不同的队列上运行具有不同参数的相同任务。有什么想法吗?
    • 那你可以对参数和路由进行条件检查吗?
    猜你喜欢
    • 2017-06-26
    • 1970-01-01
    • 2018-11-11
    • 2014-11-03
    • 2017-03-27
    • 2013-10-24
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多