如何从异步函数向同步上下文返回多个值?

2024-03-28 17:41:24 发布

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

我需要从异步调用中收集结果并将它们返回给一个普通函数——连接异步和同步代码部分让我很困惑。在

先试试丑八怪。在

import asyncio
import aiohttp

async def one_call(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            txt = await response.text()
            return txt[0:20]


async def do_all(result_inout):
    urls = ["https://cnn.com", "https://nyt.com", "http://reuters.com"]
    out = await asyncio.gather(*[one_call(url) for url in urls])
    result_inout += out

if __name__ == "__main__":
    result_inout = []
    asyncio.run(do_all(result_inout))

    print(result_inout)

第二次尝试,但是直接使用事件循环,它是应用程序代码的discouraged。在

^{pr2}$

最好的办法是什么?在


Tags: importcomasynciourlasyncaiohttpresponsesession
1条回答
网友
1楼 · 发布于 2024-03-28 17:41:24

不需要result_inout,只需使用out = asyncio.run(do_all())来获得do_allreturn res。在

import asyncio
import aiohttp

async def one_call(url):
    await asyncio.sleep(2)
    return 0


async def do_all():
    urls = ["https://cnn.com", "https://nyt.com", "http://reuters.com"]
    out = await asyncio.gather(*[one_call(url) for url in urls])
    return out

if __name__ == "__main__":
    out = asyncio.run(do_all())

    print(out)

输出将是[0, 0, 0]。在

相关问题 更多 >