【问题标题】:celery run tasks if the previous task is successful如果上一个任务成功,则 celery 运行任务
【发布时间】:2014-01-17 12:10:14
【问题描述】:

我需要运行四个任务,但只有成功后才需要一个接一个地运行。

我曾尝试像这样链接它们..但它们是独立开始的

res = (mul.si(5,5) | mul.si(5,6) | mul.si(5,7) | mul.si(5,8) | mul.si(5,9) )()

有什么想法吗?

【问题讨论】:

  • chain 正是这样做的:如果上一个任务成功返回,它就会运行下一个任务。
  • 试试:(mul.s(5) | mul.s(6) | mul.s(7) | mul.s(8) | mul.s(9)(5)
  • 想一想:上面的表达式不可能并行执行,因为下一步取决于前一个的返回值......
  • 请注意,这在我的机器上执行得如此之快,以至于时钟不够精确,无法区分实际的操作顺序。

标签: python django celery


【解决方案1】:

是的,你可以做到。但是您需要按照here 的说明存储结果。

但这很少使用,因为它将异步调用变成了同步调用

在我的例子中,

tasks.py 就像

from celery import Celery
import datetime

app = Celery('tasks',backend='amqp' broker='amqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y


def add_chained(args_list=list()):
    for args in args_list:
        print "Performing addtion for %s at %s" % (args, datetime.datetime.now())
        result = add.delay(*args)
        while not result.ready():
            pass

结果是这样的:

>>> import tasks
>>> tasks.add_chained([(1,2), (2,3), (3,4), (4,5)])
Performing addtion for (1, 2) at 2014-01-17 18:49:57.392357
Performing addtion for (2, 3) at 2014-01-17 18:49:57.428961
Performing addtion for (3, 4) at 2014-01-17 18:49:57.432598
Performing addtion for (4, 5) at 2014-01-17 18:49:57.435891

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2020-02-26
    • 2011-09-15
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多