Asyncio и маркированные Hrefs - PullRequest
0 голосов
/ 27 марта 2020

У меня есть некоторый код, где у меня есть несколько ссылок и некоторые сопровождающие ярлыки. Мне нужно убедиться, что метки, ссылки и ответы от получения ссылок все остаются связанными (например, список в списке списков, список кортежей и т. Д. c.)

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

Пример:

href_list = ['www.google.com', 'www.yahoo.com', 'www.amazon.com']
names_list = ['Google','Yahoo','Amazon']
zipped_list = list(zip(href_list,names_list))


async def fetch_href(session, href):
    response = await session.request(method='GET', url=href)
    return await response.text()

async with aiohttp.ClientSession() as session:
    page_results = await asyncio.gather(*(fetch_href(session, href) 
                                        for i, href in enumerate([item[0] for item in zipped_list])))

    #page_results may have html in a different order than the hrefs and labels in zipped_list
    #because of asyncronous behavior of the function (?) e.g:
    # page_results == [amazon_html, google_html, yahoo_html]

    #if I try to zip with zip_list or components the html results would be out of order with
    #hrefs and labels

Насколько я понимаю, элементы page_results могут не соответствовать порядку hrefs и names в zipped_list потому что эти отдельные запросы могут быть возвращены в другом порядке.

Каков наилучший способ сохранить href, name и page page все связанные друг с другом?

Спасибо.

1 Ответ

1 голос
/ 29 марта 2020

Ваши результаты будут возвращены в том порядке, в котором они были получены. Согласно документации asyncio «Порядок значений результатов соответствует порядку ожидаемых значений в aws».

Вы правы, что ваши результаты могут поступать в любом порядке, однако метод сбора собирает свой массив результатов только после завершения всех сопрограмм. Когда они завершены, он собирает результаты в том порядке, в котором были переданы ваши сопрограммы, поэтому сначала вы получите веб-сайт 1 и 2-й веб-сайт, даже если веб-сайт 2 завершен первым.

...