以字符串形式获取aiohttp结果

2024-06-10 08:21:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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))

谢谢


Tags: 代码importloopasynciourl示例路由async
1条回答
网友
1楼 · 发布于 2024-06-10 08:21:27

问题出在main()结尾的return tasks,这在原文章中没有出现。您应该返回asyncio.gather返回的元组,而不是返回coroutine对象(一旦传递给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相同的顺序返回一个文本元组。在

相关问题 更多 >