Получить aiohttp результаты в виде строки - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь получить данные с веб-сайта, используя async в python. В качестве примера я использовал этот код (в разделе «Пример лучшей сопрограммы»): https://www.blog.pythonlibrary.org/2016/07/26/python-3-an-intro-to-asyncio/

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

Код:

# -*- coding: utf-8 -*-
import aiohttp
import asyncio
import async_timeout

async def fetch(session, url):
    with async_timeout.timeout(10):
        async with session.get(url) as response:
            return await response.text()


async def main(loop, urls):
    async with aiohttp.ClientSession(loop=loop) as session:
        tasks = [fetch(session, url) for url in urls]
        await asyncio.gather(*tasks)
        return tasks

# time normal way of retrieval
if __name__ == '__main__':
    urls = [a list of urls..]

    loop = asyncio.get_event_loop()
    details_async = loop.run_until_complete(main(loop, urls))

Спасибо

1 Ответ

0 голосов
/ 16 ноября 2018

Проблема в return tasks в конце main(), которого нет в оригинальной статье. Вместо того, чтобы возвращать объекты сопрограмм (которые бесполезны после передачи в asyncio.gather), вы должны возвращать кортеж, возвращаемый asyncio.gather, который содержит результаты запуска сопрограмм в правильном порядке. Например:

async def main(loop, urls):
    async with aiohttp.ClientSession(loop=loop) as session:
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        return results

Теперь loop.run_until_complete(main(loop, urls)) вернет кортеж текстов в том же порядке, что и URL.

...