获取字符串形式的 aiohttp 结果

Yor*_*ian 0 python python-asyncio aiohttp

我正在尝试使用 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))
Run Code Online (Sandbox Code Playgroud)

谢谢

use*_*342 5

问题出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
Run Code Online (Sandbox Code Playgroud)

现在loop.run_until_complete(main(loop, urls))将按照与 URL 相同的顺序返回文本元组。