【问题标题】:Django celery crontab every 30 seconds - is it even possible?Django celery crontab 每 30 秒 - 有可能吗?
【发布时间】:2012-05-22 17:37:00
【问题描述】:

是否可以在特定时间运行 django celery crontab 非常 30 秒?

只有分钟、小时和天的设置。

我有 crontab 工作,但我希望每 30 秒运行一次,而不是每分钟运行一次。

或者...

是否可以将间隔开启 30 秒,并仅在一天中的特定时段开启间隔计划?

【问题讨论】:

    标签: django scheduled-tasks crontab celery


    【解决方案1】:

    Very first example they have in the documentation is...

    示例:每 30 秒运行一次 tasks.add 任务。

    from datetime import timedelta
    
    CELERYBEAT_SCHEDULE = {
        "runs-every-30-seconds": {
            "task": "tasks.add",
            "schedule": timedelta(seconds=30),
            "args": (16, 16)
        },
    }
    

    【讨论】:

    • 我需要它每 30 秒运行一次 在特定时间。我也遇到了他们在文档中的第一个示例
    • 我也在寻找解决方案(并遇到了这篇文章)。如果 timedelta 可以与 crontab 结合起来,那就太好了。
    【解决方案2】:

    如果您真的需要这样做并且您需要快速解决方案,您可以求助于添加: 睡觉 进入你的脚本。 (显然,您需要在脚本中添加一个参数以将睡眠时间设置为 0 或 30 秒,并将脚本添加到 crontab 中两次,一次使用 0 作为参数,第二次使用 30)。

    请不要对我投反对票!这是一个解决方案,尽管我很清楚这不是一个理想的解决方案。

    【讨论】:

      【解决方案3】:

      你可以使用

      from datetime import timedelta
      
      @periodic_task(run_every=timedelta(seconds=30))
      def thirty_second_task():
         now = datetime.now()
         if now.hour == 12 or now.hour == 9:
             your code goes here`
      

      这将每三十秒运行一次函数,但它只会在当前时间的小时值为 12 或 9 时运行您的代码。

      【讨论】:

        【解决方案4】:

        我会通过安排另一个任务来启用/禁用主要任务来使用您的替代解决方案:

        # tasks.py
        from djcelery.models import PeriodicTask
        
        @app.task
        def toggle_thirty_second_task:
            # you would use whatever you named your task below
            thirty_second_tasks = PeriodicTask.objects.filter(name='runs-every-30-seconds')
            if thirty_second_tasks:
                # this returned an array, so we'll want to look at the first object
                thirty_second_task = thirty_second_tasks[0]
                # toggle the enabled value
                thirty_second_task.enabled = not thirty_second_task.enabled
                thirty_second_task.save()
        

        然后只需使用 crontab 在您需要切换的时间安排此任务。或者,您可以安排一个任务将其打开,一个任务将其关闭,而不处理切换逻辑。

        希望这会有所帮助。

        sc

        【讨论】:

          猜你喜欢
          • 2015-12-17
          • 1970-01-01
          • 2017-11-25
          • 2019-02-08
          • 1970-01-01
          • 2022-10-14
          • 1970-01-01
          • 2017-05-15
          • 2019-09-21
          相关资源
          最近更新 更多