我使用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