如果使用for循环发送多个HTTP GET请求,为什么aiohttp仍然比requests更快?

问题描述 投票:0回答:1

我正在关注此页面中的代码: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 更快?

python asynchronous async-await coroutine aiohttp
1个回答
0
投票

requests 是一个同步库,这意味着它会阻塞,直到每个请求完成后才会继续处理下一个请求。这导致延迟, aiohttp 是一个异步库,它使用 asyncio 来并发处理请求,而不会阻塞代码的执行。这允许 aiohttp 并行处理多个请求,与请求的顺序方法相比,整体性能更快

© www.soinside.com 2019 - 2024. All rights reserved.