Python - rychlost asynchroního kódu
Asynchroní zpracování vstupně-výstupních operací je poslední roky velký trend. Python od verze 3.4 obsahuje novou knihovnu asyncio a v nedávno vydané verzi 3.5 přibyla i podpora pro klíčová slova async a await, které můžete znát třeba z C#. V tomto článku bych se rád podíval na rychlost asynchroního kódu v Pythonu a srovnal ho s konkurencí (Go, Erlang, Node.JS).
Každého zajímají hlavně výsledky, tady jsou:
Ve všech případech jsem testoval jednoduchý HTTP server, který vrací pouze "Hello world!". Zdrojáky všech testů jsou dostupné na githubu. Z testů jsem vyřadil cython, nuitku a pypy3, protože nevykazovaly žádné převratné výsledky ve srovnání s pypy i pythonem.
Co můžeme vyčíst z výsledků:
- Nová knihovna aiohttp používající novou async syntax na tom zatím výkonově moc dobře není, v testu dopadla nejhůře. Samotná knihovna asyncio, která je součástí Pythonu na tom není o mnoho lépe.
- PyPy s knihovnou Trollius je srovnatelně rychlé či dokonce o trochu rychlejší než Node.JS.
- Jako velmi rychlé se ukázalo Go se svojí standardní knihovnou net/http.
- PyPy s knihovnou Tornado sice není výkonově úplně stabilní, ale v průměru se ukázalo jako dokonce rychlejší než Go.
- Překvapivým vítězem testu se stalo PyPy v kombinaci s knihovnou Asyncore.
UPDATE
Do testu bylo přidáno několik nových kandidátů - Japronto, Meinheld, Sanic a kombinace uvloop+httptools. Zejména Japronto přináší velmi zajímavý výkon, přinejmenším srovnatelný s dosavadním vítězem testu Asyncore (s PyPy).
UPDATE 2
Doplněna Vibora.