fbpx

Как дождаться завершения четырех асинхронных get-запросов?

259 просмотра
0
0 Комментариев

Есть функция в приложении на пайтон, которая делает четыре get-запроса, затем присваивает их ответы в переменные и дальше обрабатывает эти переменные. Это происходит синхронно. Возможно ли, запустить эти четыре запроса обрабатываться одновременно асинхронно, а затем поставить функцию на «паузу» до тех пор, пока все они не вернут результат? Т.е. фактически написать синхронно асинхронный код.

Приложение на фреймворке Tornado


Добавить комментарий

1 Ответы

Python Опубликовано 20.03.2019
0

(Небольшой disclaimer: вижу Tornado и документацию к нему в первый раз)

  • Если я правильно понимаю, то для ваша задача изящно решается с помощью tornado.gen, который использует futures для параллельного выполнения subtask'ов и синтаксис, основанный на yield:

    <a href="/users/6402/web">@web</a>.asynchronous
    <a href="/users/99/genshen">@gen</a>.coroutine
    def perform_requests_and_handle_them(self):
        client = AsyncHTTPClient()
     
        # В вашем случае здесь будет 4 параллельно
        # выполняющихся операции.
        response1, response2 = yield [client.fetch(url1),
                                      client.fetch(url2)]
     
        # Здесь вы синхронно обрабатываете результат асинхронно
        # выполненных запросов.
        synchronously_handle_responses(response1, response2)
    

  • Если документация корректна, то этот код делает ровно то, что вы описали в вашей постановке задачи:

  • Most asynchronous functions in Tornado return a Future; yielding this object returns its result.

  • You can also yield a list of Futures and/or Tasks, which will be started at the same time and run in parallel; a list of results will be returned when they are all
    finished.

  • Несколько дополнительных референсов по теме:
Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up