10

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

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

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

或者...

是否可以将间隔打开 30 秒,然后仅在一天中的特定时段打开间隔时间表?

4

4 回答 4

14

他们在文档中的第一个例子是......

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

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    "runs-every-30-seconds": {
        "task": "tasks.add",
        "schedule": timedelta(seconds=30),
        "args": (16, 16)
    },
}
于 2012-05-15T08:41:01.143 回答
4

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

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

于 2012-05-15T08:32:04.850 回答
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`

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

于 2018-11-09T17:39:14.053 回答
2

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

# 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

于 2014-08-05T15:41:19.863 回答