7

我发现我可以将任务设置为在特定时间从此处以特定时间间隔运行但这仅在任务声明期间完成。如何将任务设置为定期动态运行?

4

4 回答 4

8

时间表是从一个设置派生的,因此在运行时似乎是不可变的。

您可能可以使用Task ETA完成您正在寻找的东西。这保证了您的任务不会在所需时间之前运行,但不承诺在指定时间运行任务 - 如果工作人员在指定的 ETA 超载,则任务可能会稍后运行。

如果该限制不是问题,您可以编写一个首先自行运行的任务,例如:

@task
def mytask():
    keep_running = # Boolean, should the task keep running?
    if keep_running:
        run_again = # calculate when to run again
        mytask.apply_async(eta=run_again)
    # ... do the stuff you came here to do ...

这种方法的主要缺点是您依赖任务存储来记住正在运行的任务。如果其中一个在启动下一个之前失败,则该任务将永远不会再次运行。如果您的代理没有持久化到磁盘并且它死了(带着所有正在进行的任务),那么这些任务都不会再次运行。

您可以通过某种事务日志记录和定期“保姆”任务来解决这些问题,该任务的工作是找到此类因过早死亡而重复的任务并恢复它们。

如果我必须实现你所描述的,我认为这就是我的处理方式。

于 2011-08-24T10:17:18.783 回答
2

celery.task.base.PeriodicTask定义is_due哪个确定下一次运行的时间。您可以覆盖此函数以包含您的自定义动态运行逻辑。请参阅此处的文档:http ://docs.celeryproject.org/en/latest/reference/celery.task.base.html?highlight=is_due#celery.task.base.PeriodicTask.is_due

一个例子:

import random
from celery.task import PeriodicTask

class MyTask(PeriodicTask):

    def run(self, **kwargs):
        logger = self.get_logger(**kwargs)
        logger.info("Running my task")

    def is_due(self, last_run_at):
        # Add your logic for when to run. Mine is random
        if random.random() < 0.5:
            # Run now and ask again in a minute
            return (True, 60)
        else:
            # Don't run now but run in 10 secs
            return (True, 10)
于 2011-08-24T13:21:37.997 回答
0

见这里http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html

我认为你不能动态地做到这一点......最好的方法是在任务中创建任务:D

例如,您想稍后运行 X 秒,然后创建具有 x 秒延迟的新任务,并在此任务中为 N*X 秒延迟创建另一个任务...

于 2011-08-24T08:53:01.287 回答
0

这应该对您有所帮助... http://celery.readthedocs.org/en/latest/faq.html#can-i-change-the-interval-of-a-periodic-task-at-runtime

一旦你定义了一个自定义的时间表,按照上面 asksol 的建议将它分配给你的任务。

CELERYBEAT_SCHEDULE = {    
    "my_name": {
        "task": "myapp.tasks.task",
        "schedule": myschedule(),    
    }
}

You might also want to modify CELERYBEAT_MAX_LOOP_INTERVAL if you want your schedule to update more often than every five minutes.

于 2014-05-24T14:03:24.273 回答