Вот мои настройки:
В моем файле settings.py у меня есть
BROKER_BACKEND = "djkombu.transport.DatabaseTransport"
, т.е. я просто использую базу данных для постановки задач в очередь.
Теперь перейдем к Моя проблема: у меня есть инициированная пользователем задача, выполнение которой может занять несколько минут. Я хочу, чтобы задача запускалась только один раз для каждого пользователя, и я буду кэшировать результаты задачи во временном файле, поэтому, если пользователь снова инициирует задачу, я просто верну кешированный файл. У меня есть код, который в моей функции просмотра выглядит следующим образом:
task_id = "long-task-%d" % user_id
result = tasks.some_long_task.AsyncResult(task_id)
if result.state == celery.states.PENDING:
# The next line makes a duplicate task if the user rapidly refreshes the page
tasks.some_long_task.apply_async(task_id=task_id)
return HttpResponse("Task started...")
elif result.state == celery.states.STARTED:
return HttpResponse("Task is still running, please wait...")
elif result.state == celery.states.SUCCESS:
if cached_file_still_exists():
return get_cached_file()
else:
result.forget()
tasks.some_long_task.apply_async(task_id=task_id)
return HttpResponse("Task started...")
Этот код почти работает. Но я сталкиваюсь с проблемой, когда пользователь быстро перезагружает страницу. Там' sa 1-3 секундная задержка между постановкой задачи в очередь и окончательной ее извлечением из очереди и передачей работнику. В течение этого времени состояние задачи остается PENDING, что приводит к тому, что логика представления запускает повторяющуюся задачу.
Мне нужен какой-то способ узнать, была ли задача уже отправлена в очередь, чтобы я не отправлял это дважды. Есть ли стандартный способ сделать это с сельдереем?