【问题标题】:Celery, run task once at a specified time芹菜,在指定时间运行一次任务
【发布时间】:2017-05-24 21:52:43
【问题描述】:

如何在给定时间运行 celery 任务,但只能运行一次?

我阅读了文档,但找不到任何示例。

【问题讨论】:

    标签: python celery


    【解决方案1】:

    PeriodicTask 中有一个名为one_off 的布尔字段。将其设置为 true 以便在给定时间仅运行一次 celery 任务。

    示例(以下代码为views.py中的动态任务创建部分):

    def test():
        schedule, created = CrontabSchedule.objects.get_or_create(hour=20, minute=6, day_of_month=1, month_of_year=9)
        task = PeriodicTask.objects.create(crontab = schedule, name = 'somename', task = 'core.tasks.methodnameintasks', one_off=True)
    

    但是,在更新 celery beat 之前,该任务将保持启用状态。在现有任务中创建或更新新任务将解决此问题。

    【讨论】:

      【解决方案2】:

      调用任务时可以使用参数eta。示例:

      from datetime import datetime, timedelta
      
      @app.task()
      def hello(self):
          return 'hello world'
      
      
      tomorrow = datetime.utcnow() + timedelta(days=1)
      hello.apply_async(eta=tomorrow)
      

      文档:http://docs.celeryproject.org/en/latest/userguide/calling.html#eta-and-countdown

      或者,当您想多次调用hello 并且以确保它一次只执行一次时,您可以使用锁定 - 更多信息在文档中:http://docs.celeryproject.org/en/latest/tutorials/task-cookbook.html#ensuring-a-task-is-only-executed-one-at-a-time

      【讨论】:

        【解决方案3】:

        如果你坚持使用 Celery

        ​​>

        要在指定时间运行任务,在 Celery 中,您通常会使用 periodic task,这通常是循环任务。

        但是,您可以创建一个具有非常具体的计划和条件的周期性任务,该任务只发生一次,因此它只运行一次。

        很遗憾,我们只能specify 这么多,例如我们可以指定hourminuteday_of_monthmonth_of_year,但我们不能指定year

        但是,您的任务每年最多运行 1 次,因此以下是一些解决方法:

        运行后取消调度

        一旦运行,取消调度它应该相对容易(你有 1 年的时间这样做!)

        任务完成时使用“DONE”标志

        通过在某处(磁盘或数据库)写入标志,您可以首先检查任务之前是否运行过,即if done: exit

        如果年份不合适则退出 或者您想要安全,只需将代码添加到检查年份的任务中,例如if year != 2017: exit.

        简单的 cron/Os 级调度程序也可以工作

        您也可以完全跳过 Celery 并使用一些操作系统级别的工具,例如用于类 UNIX 系统的 cron,more on that here

        总体思路保持不变。

        【讨论】:

        • 好吧,我会做:周期性任务每 1 分钟运行一次,任务在 redis 上查找是否已运行,如果没有,则通过 celery 执行任务
        猜你喜欢
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 2019-02-26
        • 2015-05-11
        • 2015-05-25
        • 2014-02-11
        • 1970-01-01
        相关资源
        最近更新 更多