在Celery中,如何运行一个任务,然后让该任务运行另一个任务,并持续下去?

3 投票
2 回答
9869 浏览
提问于 2025-04-16 09:09
#tasks.py
from celery.task import Task
class Randomer(Task):
    def run(self, **kwargs):
        #run Randomer again!!!
        return random.randrange(0,1000000)


>>> from tasks import Randomer
>>> r = Randomer()
>>> r.delay()

现在,我在运行一个简单的任务。它会返回一个随机数字。但是,我该如何在这个任务内部运行另一个任务呢?

2 个回答

2

你可以像这里描述的那样,把子任务串联起来:http://docs.celeryproject.org/en/latest/userguide/canvas.html#chains

6

你可以在 Randomer.run 里面调用 other_task.delay();在这种情况下,你可能想把 Randomer.ignore_result = True(还有 other_task.ignore_result,等等)设置为真。

记住,celery 任务的 delay 方法会立即返回,所以如果你在嵌套调用(或者递归调用)上没有设置任何限制或等待时间,你可能会很快遇到崩溃的问题。

与其使用递归或嵌套任务,不如考虑使用无限循环来避免栈溢出(这不是开玩笑)。

from celery.task import Task
class Randomer(Task):
    def run(self, **kwargs):
        while True:
           do_something(**kwargs)
           time.sleep(600)

撰写回答