Używam Asyncio i Żądań do testowania szeregu żądań HTTP.Asyncio sprawia, że żądania HTTP są wolniejsze?
Z jakiegoś powodu jest nieco wolniej używać Asyncio niż prostych żądań. Każdy pomysł, dlaczego? Czy używam Asyncio niepoprawnie?
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))
wyjściowa:
Wariant A = Asyncio; Wersja B = Żądania:
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
Wielką odpowiedź, że pomaga! Czy są jakieś zalety posiadania wątków odradzania 'asyncio' zamiast robić to bezpośrednio? – okoboko
@okoboko Jeśli zamierzasz używać 'requests', naprawdę nie ma potrzeby używania' asyncio', chyba że masz inne komponenty w projekcie, które są faktycznie zaprojektowane do użycia z 'asyncio'. Jeśli tak jest, powinieneś faworyzować 'aiohttp' zamiast' requests', chyba że potrzebujesz funkcji 'request', której nie ma w' aiohttp'. – dano
Jedna notatka z 'loop.run_in_executor' - kiedy używasz domyślnego executora (przekazując' None' jako pierwszy argument), używasz 'concurrent.futures.ThreadPoolExecutor' z pięcioma wątkami. Oznacza to, że można uruchamiać tylko pięć żądań jednocześnie, co jest dość niskie dla obciążenia związanego z operacjami we/wy. Prawdopodobnie uzyskasz lepszą wydajność, jeśli utworzysz własny ThreadPoolExecutor z większą liczbą wątków. – dano