我使用Asyncio和Requests来测试一系列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如果你打算使用'requests',那么实际上不需要使用'asyncio',除非你的项目中有其他的组件实际上是为'asyncio'使用而设计的。如果是这样的话,除非你需要'aiohttp'中缺少'request'的特性,否则你应该在'request'上面支持'aiohttp'。 – dano
带'loop.run_in_executor'的一个注释 - 当您使用默认执行程序(通过传递'None'作为第一个参数)时,您使用带有五个线程的'concurrent.futures.ThreadPoolExecutor'。这意味着您只能同时运行五个请求,这对于I/O绑定的工作负载来说相当低。如果使用更多线程创建自己的ThreadPoolExecutor,您可能会获得更好的性能。 – dano