首页 > 解决方案 > asyncio - 函数顺序运行而不是同时运行

问题描述

我有一个发送 2 个不同请求的函数。我需要用不同的参数调用这个函数 20 次。

我想同时运行这些函数(不同的参数),以便在请求和响应之间腾出一些时间。

这是一个非常简化的函数:

async def get_data(url):
    return requests.get(url)

这就是我所说的:

loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(get_data(url)) for url in websites.split('\n')]
group = asyncio.gather(*tasks)
results = loop.run_until_complete(group)
print(results)
loop.close()

问题是它顺序运行而不是同时运行。

很明显,我错过了一些东西。你知道该怎么做吗?

标签: pythonpython-requestspython-asyncio

解决方案


不要将协程包裹在 中asyncio.create_task,用于*在传递到最后asyncio.gather调用时解包协程loop.run_until_complete

loop = asyncio.get_event_loop()
tasks = [get_data(url) for url in websites.split('\n')]
group = asyncio.gather(*tasks)
results = loop.run_until_complete(group)
print(results)
loop.close()

另外,它不会并发,因为requests它不是异步的,它阻塞了线程,您需要使用替代的异步 HTTP 客户端,例如aiohttp.


推荐阅读