Utilizzo Asyncio e Requests per eseguire il benchmark di una serie di richieste HTTP.Asyncio Rende le richieste HTTP più lente?
Per qualche motivo, è leggermente più lento utilizzare Asyncio piuttosto che solo richieste dirette. Qualche idea del perché? Sto usando Asyncio in modo errato?
import asyncio
import functools
import requests
import time
ts = time.time()
for i in range(10):
@asyncio.coroutine
def do_checks():
loop = asyncio.get_event_loop()
req = loop.run_in_executor(None, functools.partial(requests.get, "http://google.com", timeout=3))
resp = yield from req
print(resp.status_code)
loop = asyncio.get_event_loop()
loop.run_until_complete(do_checks())
te = time.time()
print("Version A: " + str(te - ts))
ts = time.time()
for i in range(10):
r = requests.get("http://google.com", timeout=3)
print(r.status_code)
te = time.time()
print("Version B: " + str(te - ts))
uscita:
Versione A = Asyncio; Versione B = Richieste
200
200
200
200
200
200
200
200
200
200
Version A: 5.7215821743011475
200
200
200
200
200
200
200
200
200
200
Version B: 5.320340156555176
Grande risposta, che aiuta! Ci sono dei vantaggi nell'avere thread di generazione 'asyncio' invece di farlo direttamente? – okoboko
@okoboko Se vuoi usare 'requests', non c'è davvero bisogno di usare' asyncio', a meno che tu non abbia altri componenti nel tuo progetto che sono effettivamente progettati per l'uso con 'asyncio'. E se questo è il caso, dovresti preferire 'aiohttp' su' requests', a meno che non ti serva una funzionalità di 'requests' che manchi di' aiohttp'. – dano
Una nota con 'loop.run_in_executor' - quando si usa l'esecutore predefinito (passando' None 'come primo argomento), si utilizza un 'concurrent.futures.ThreadPoolExecutor' con cinque thread. Ciò significa che puoi eseguire solo cinque richieste contemporaneamente, il che è piuttosto basso per un carico di lavoro legato all'I/O. Probabilmente otterrai prestazioni migliori se crei il tuo ThreadPoolExecutor con più thread. – dano