Я использую Asyncio и запросы для тестирования серии HTTP-запросов.Asyncio Выполнение запросов HTTP медленнее?
По некоторым причинам, это немного медленнее, чем Asyncio, чем просто прямые запросы. Любая идея почему? Я неправильно использую Asyncio?
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))
Выход:
Вариант A = Asyncio; Версия B = Запросы
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
Великий ответ, что помогает! Существуют ли какие-либо преимущества, связанные с тем, что 'asyncio' запускает потоки вместо того, чтобы делать это напрямую? – okoboko
@okoboko Если вы собираетесь использовать 'запросы', нет необходимости использовать' asyncio', если у вас нет других компонентов в вашем проекте, которые на самом деле предназначены для использования с 'asyncio'. И если это так, вы должны одобрить 'aiohttp' над' запросами', если вам не нужна функция 'запросов', отсутствующая в' aiohttp'. – dano
Одна нота с 'loop.run_in_executor' - при использовании исполнителя по умолчанию (путем передачи' None' в качестве первого аргумента) вы используете 'concurrent.futures.ThreadPoolExecutor' с пятью потоками. Это означает, что вы можете одновременно запускать только пять запросов, что довольно мало для рабочей нагрузки, связанной с вводом-выводом. Вероятно, вы получите лучшую производительность, если создадите свой собственный ThreadPoolExecutor с большим количеством потоков. – dano