Дождаться результата внешнего веб-сервиса внутри задачи - PullRequest
0 голосов
/ 22 сентября 2011

Мне нужно написать кучу задач, где каждая задача должна запрашивать внешний веб-сервис. Веб-служба всегда отвечает статусом 202 ACCEPTED и указывает в заголовке Location на URI, где результат может быть опрошен. Время, необходимое для доставки этого веб-сервиса, может варьироваться от 2 секунд до минуты. Мне было интересно, как лучше всего запрограммировать мою задачу из сельдерея. Сейчас я отправляю запрос и запускаю цикл while, пока не опрошу результат, например:

while True:
    result = poll_webservice()
    if result:
        break
    else:
        time.sleep(5)

[ continue with the rest of the task ]

Хотя это, безусловно, работает, мне это кажется очень грубым, и я также блокирую работника сельдерея, пока результат не будет опрошен. Есть ли лучший подход?

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

Вы наверняка убиваете свои ресурсы. Просто запросите ваш внешний веб-сервис и сохраните URI для опроса (используйте кеш или дб). Затем вы можете иметь периодическое задание , которое собирает результаты, если они готовы ...

0 голосов
/ 23 сентября 2011

Как насчет использования task.retry?

@task(max_retries=100)
def poll_webservice_task(url):
    result = poll_webservice(url)
    if result:
       return result
    poll_webservice_task.retry(countdown=5)
0 голосов
/ 22 сентября 2011

Я бы подумал о задаче сельдерея, которая опрашивает Локацию, предоставленную ответом 202. Если он завершен, он обрабатывает его, иначе он помещает себя в очередь (или свою копию) на некоторое время спустя.

Для бонусных баллов, если у вас много таких заданий, вы можете увеличивать время между опросами каждый раз, когда ответ не готов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...