Обрабатывать следующую итерацию цикла в ожидании

Я работаю над выяснением новых ключевых слов async, добавленных в Python 3.5+, и у меня возникла проблема, которую я пытаюсь решить с помощью async. Вот простой пример:

from aiohttp import ClientSession
session = ClientSession()
for x in data:
  # x=LOTS OF POST DATA
  async with session.post("my-url.com", data=x) as response:
    # START THE NEXT ITERATION OF THE LOOP NOW
    rep = await response.read()
    ...
    # DO SOME WORK WITH THE RESPONSE

Проблема здесь в том, что вместо перехода к следующей итерации поток останавливается.

Я знаю способы пройти через все URL-адреса сразу и поместить их во фьючерсы для последующего перебора всех из них для последующей обработки, однако я хочу поработать над ответом после того, как он будет готов, а не сразу все сразу.

Есть ли способ предотвратить потерю времени при ожидании ответа? В идеале, пока он ждет сетевого ввода-вывода, я бы хотел, чтобы сценарий начал выстраивать в очередь еще несколько ответов для запуска. Поскольку отправляемые данные требуют времени для загрузки.

Если что-то неясно, дайте мне знать, и я постараюсь ответить. Спасибо!

Я почти уверен, что для того, чтобы делать то, что вы хотите, тело цикла (строка async with и остальное) должно быть в отдельной сопрограмме, которую вы планируете в цикле, а не запускать ее напрямую.

Blckknght 10.08.2018 18:07

@Blckknght не могли бы вы помочь с примером того, что вы имеете в виду? Вы имеете ввиду отдельный async def? Из того, что я пробовал, это все еще останавливает цикл

Chaos 10.08.2018 18:22

Я не очень разбираюсь в асинхронном коде, поэтому не уверен, что знаю, как это сделать правильно. Но главный трюк состоит в том, чтобы запланировать выделенную сопрограмму с вашим циклом событий, а не напрямую ее await. Попробуйте что-то вроде asyncio.ensure_future(post_data_and_handle_response(x)) или, может быть, что-то с использованием asyncio.gather с пониманием, чтобы запланировать все сопрограммы для всех ваших значений x сразу.

Blckknght 10.08.2018 18:47
0
3
58
0

Другие вопросы по теме