检查 Celery 中计划的定期任务的下一个运行时间(使用 Django)



*使用芹菜 3.1.25,因为 django-celery-beat 1.0.1 在调度定期任务时存在问题。

最近,我遇到了一个关于芹菜节拍的问题,其中间隔为一天或更长时间的定期任务似乎被调度程序"遗忘"了。如果我将间隔更改为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()

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

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

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

相关内容

  • 没有找到相关文章

最新更新