【问题标题】:Checking the next run time for scheduled periodic tasks in Celery (with Django)检查 Celery 中计划定期任务的下一次运行时间(使用 Django)
【发布时间】:2017-08-12 22:47:27
【问题描述】:

*使用 celery 3.1.25 因为 django-celery-beat 1.0.1 在调度周期性任务方面存在问题。

最近我遇到了 celerybeat 的问题,即间隔为一天或更长时间的周期性任务似乎被调度程序“忘记”了。如果我将时间间隔更改为every 5 seconds,则任务会正常执行(每 5 秒一次)并且last_run_at 属性会更新。这意味着 celerybeat 在一定程度上响应了调度程序,但是如果我重置last_run_atPeriodicTask.objects.update(last_run_at=None),则间隔为every day 的任务将不再运行。

Celerybeat 有一次崩溃了,这可能已经损坏了某些东西,所以我创建了一个新的 virtualenv 和数据库来查看问题是否仍然存在。我想知道是否有办法检索下一次运行时间,这样我就不必等待一天才能知道我的周期性任务是否已执行。

我也尝试过使用inspect <active/scheduled/reserved>,但都返回了empty。这对于使用 djcelery 的数据库调度程序的周期性任务是否正常?

这是调度任务的函数:

def schedule_data_collection(request, project):
    if (request.method == 'POST'):
        interval = request.POST.get('interval')

        target_project = Project.objects.get(url_path=project)    
        interval_schedule = dict(every=json.loads(interval), period='days')

        schedule, created = IntervalSchedule.objects.get_or_create(
            every=interval_schedule['every'],
            period=interval_schedule['period'],
        )

        task_name = '{} data collection'.format(target_project.name)

        try:
            task = PeriodicTask.objects.get(name=task_name)
        except PeriodicTask.DoesNotExist:
            task = PeriodicTask.objects.create(
                interval=schedule,
                name=task_name,
                task='myapp.tasks.collect_tool_data',
                args=json.dumps([target_project.url_path])
            )
        else:
            if task.interval != schedule:
                task.interval = schedule

            if task.enabled is False:
                task.enabled = True

            task.save()

        return HttpResponse(task.interval)
    else:
        return HttpResponseForbidden()

【问题讨论】:

  • 您的后端使用什么?它应该在数据库中注册。
  • @sdolan 我正在使用带有 PostgreSQL 的 RabbitMQ。每当我添加任务的新实例时,调度程序都会自行更新,但仍不会触发工作人员执行它。

标签: django celery celerybeat djcelery


【解决方案1】:

您可以通过进入 shell 并查看 app.conf.CELERYBEAT_SCEDULE 来查看您的调度程序。

celery -A myApp shell
print(app.conf.CELERYBEAT_SCHEDULE)

这应该会显示您所有的定期任务。

【讨论】:

    猜你喜欢
    • 2014-03-17
    • 2022-11-11
    • 1970-01-01
    • 2012-05-09
    • 2019-08-23
    • 2011-07-18
    • 2017-09-22
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多