How to tell if a task has already been queued in django-celery?

Вот мои настройки:

  • django 1.3
  • сельдерей 2.2 .6
  • django-celery 2.2.4
  • djkombu 0.9.2

В моем файле 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, что приводит к тому, что логика представления запускает повторяющуюся задачу.

Мне нужен какой-то способ узнать, была ли задача уже отправлена ​​в очередь, чтобы я не отправлял это дважды. Есть ли стандартный способ сделать это с сельдереем?

17
задан cwick 4 May 2011 в 20:03
поделиться