我正在关注此页面中的代码:https://www.twilio.com/en-us/blog/asynchronous-http-requests-in-python-with-aiohttp。 这是使用
aiohttp
的第一种方法:
import aiohttp
import asyncio
import time
start_time = time.time()
async def main():
async with aiohttp.ClientSession() as session:
for num in range(1, 10):
pokemon_url = f'https://pokeapi.co/api/v2/pokemon/{num}'
async with session.get(pokemon_url) as response:
pokemon_json = await response.json()
print(pokemon_json['name'], num)
asyncio.run(main())
print(f'{time.time() - start_time} seconds')
如果我理解正确的话,for循环会同步执行
session.get
,从而按顺序发送GET请求。在 for 循环的每次迭代中, await
关键字会导致 main
协程暂停,事件循环没有其他协程要执行,它所做的就是等待 response.json()
返回结果。异步编程在这里并没有提供任何额外的性能改进。
方法 2 是使用
requests
的常规方法。也是同步执行的:
import requests
import time
start_time = time.time()
for num in range(1, 10):
url = f'https://pokeapi.co/api/v2/pokemon/{num}'
response = requests.get(url)
pokemon = response.json()
print(pokemon['name'])
print(f'{time.time() - start_time} seconds')
方法 1 花费了 3.581976890563965 秒。方法 2 花费了 8.428680419921875 秒。 既然他们都是顺序执行GET请求的,那么方法1的原因是什么 使用
aiohttp
仍然比使用 requests
的方法 2 更快?
requests 是一个同步库,这意味着它会阻塞,直到每个请求完成后才会继续处理下一个请求。这导致延迟, aiohttp 是一个异步库,它使用 asyncio 来并发处理请求,而不会阻塞代码的执行。这允许 aiohttp 并行处理多个请求,与请求的顺序方法相比,整体性能更快