Bir dizi HTTP isteğini karşılaştırmak için Asyncio ve Requests kullanıyorum.Asyncio HTTP Talepleri Daha Yavaş Yapılıyor?
Bazı nedenlerden ötürü, Asyncio'yu sadece düz İsteklerden daha az kullanmak daha yavaştır. Bir fikrin neden? Asyncio'yu yanlış mı kullanıyorum?
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))
Çıkış:
Tip A = Asyncio; Versiyon B = Talepler
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
Büyük cevabı, yardımcı olur! Asyncio'yu doğrudan yapmak yerine işlenen konulara sahip olmanın avantajları var mı? – okoboko
@okoboko Eğer 'request' kullanacaksanız, asyncio'yla kullanmak için tasarlanan projenizde başka bileşenler yoksa,' asyncio' kullanmaya gerek yoktur. Ve eğer durum buysa, 'aiohttp'den eksik olan 'request' özelliklerine ihtiyaç duymadıkça' aiohttp' '' request' seçeneğini tercih etmelisiniz. – dano
'loop.run_in_executor' ile bir not - varsayılan yürütücüyü kullandığınızda (ilk argüman olarak' None'ı geçerek), beş iş parçacığıyla bir 'concurrent.futures.ThreadPoolExecutor' kullanıyorsunuz. Bu, eşzamanlı olarak beş istek çalıştırabileceğiniz anlamına gelir, yani G/Ç bağlı iş yükü için oldukça düşüktür. Kendi ThreadPoolExecutor'ınızı daha fazla iş parçacığıyla oluşturursanız muhtemelen daha iyi bir performans elde edersiniz. – dano