* django-celery-beat 1.0.1이 정기적 인 작업 예약에 문제가 있으므로 celery 3.1.25를 사용합니다.Celery (Django 사용)에서 예약 된 주기적 작업의 다음 실행 시간 확인
최근 셀러 비트 (celerybeat) 문제로 인해 일정 기간 동안 일정한 간격으로 일정한 작업이 스케줄러에서 '잊어 버린 것'으로 보입니다. 간격을 every 5 seconds
으로 변경하면 작업이 정상적으로 (5 초마다) 실행되고 last_run_at
속성이 업데이트됩니다. 이것은 셀러리 비트가 스케줄러에 어느 정도 응답하고 있음을 의미하지만, last_run_at
즉 PeriodicTask.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
@sdolan 나는 RabbitMQ w/PostgreSQL을 사용하고 있습니다. 작업의 새 인스턴스를 추가 할 때마다 스케줄러가 자동으로 업데이트되지만 여전히 작업자가 실행하도록 트리거하지는 않습니다. – FatHippo