* django-celery-beat 1.0.1は定期的なタスクのスケジューリングに問題があるため、celery 3.1.25を使用しています。Celery(Django)でスケジュールされた定期的なタスクの次の実行時間を確認してください
最近、セラービートに関する問題が発生し、1日以上の間隔を持った定期的なタスクがスケジューラによって「忘れられた」ように見えます。間隔をevery 5 seconds
に変更すると、タスクは正常に実行され(5秒ごとに)、last_run_at
属性が更新されます。これは、セルラービートがある程度スケジューラーに応答していることを意味しますが、last_run_at
つまりPeriodicTask.objects.update(last_run_at=None)
をリセットすると、every day
の間隔のタスクはもう実行されません。
Celerybeatが一点でクラッシュしていて、何かが壊れている可能性があるので、問題が解決しないかどうかを確認するために新しいvirtualenvとデータベースを作成しました。次の実行時間を取得する方法があるかどうかを知りたいので、定期的なタスクが実行されたかどうかを知るために1日待つ必要はありません。
inspect <active/scheduled/reserved>
を使用してみましたが、すべてempty
が返されました。 djceleryのデータベーススケジューラを使用して周期的なタスクを実行する場合、これは正常ですか?
ここでスケジュールタスク機能です:あなたは、シェルに入るとapp.conf.CELERYBEAT_SCEDULEを見て、あなたのスケジューラを見ることができます
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