L'uvloop és una implementació alternativa del bucle d'esdeveniments de la biblioteca asyncio del llenguatge de programació Python. Està construïda sobre la biblioteca libuv —la mateixa que constitueix la base del temps d'execució de Node.js— i està escrita en gran part en Cython. El seu objectiu és substituir el bucle d'esdeveniments per defecte de Python per oferir un rendiment notablement superior, tot mantenint intacta la sintaxi async/await.

Motivació i fonament El mòdul estàndard asyncio de Python proporciona una implementació pròpia del bucle d'esdeveniments, que és la que s'utilitza de manera predeterminada. Tanmateix, és perfectament possible emprar una implementació diferent amb característiques de rendiment distintes. Una manera de fer-ho és crear una subclasse de la classe AbstractEventLoop i implementar-ne els mètodes, però també existeixen implementacions ja fetes que es poden adoptar directament, com és el cas de l'uvloop.

L'uvloop es basa en gran manera en la biblioteca libuv, escrita en llenguatge C. Pel fet d'estar implementada en C en lloc de codi Python interpretat, libuv ofereix un millor rendiment, i com a conseqüència l'uvloop pot ser més ràpid que el bucle d'esdeveniments per defecte d'asyncio. Aquest avantatge és especialment notable en aplicacions basades en sòcols i en fluxos de dades (streams).

Disseny conceptual Un aspecte rellevant d'asyncio és que, conceptualment, és independent de la sintaxi async/await i de les coroutines. Les coroutines i aquesta sintaxi són conceptes independents de la capacitat d'executar-los: Python inclou una implementació de bucle d'esdeveniments per defecte, però es podria utilitzar qualsevol altra, fins i tot una de pròpia. Aquesta separació és la que permet bescanviar el bucle d'esdeveniments d'asyncio per implementacions diferents, amb un rendiment potencialment millor, sense haver de modificar la resta del codi asíncron.

Ús L'uvloop es pot activar de manera senzilla. La via més directa és cridar la funció uvloop.install(), que s'encarrega de bescanviar el bucle d'esdeveniments. Alternativament, es pot fer de manera manual creant un bucle nou i establint-lo com a bucle actiu:

loop = uvloop.new_event_loop() asyncio.set_event_loop(loop)

L'element fonamental és que aquesta operació s'ha de fer abans de cridar asyncio.run(). Internament, asyncio.run() invoca la funció get_event_loop, que crea un bucle d'esdeveniments si no n'existeix cap; si la instal·lació de l'uvloop no s'ha completat abans, s'obté un bucle d'asyncio convencional i la instal·lació posterior no té cap efecte.

Disponibilitat i rendiment En el moment de redactar les fonts emprades, l'uvloop només estava disponible en plataformes de tipus Unix. El projecte, allotjat a GitHub, inclou codi per fer proves de referència (benchmarks) tant de capacitat de processament (throughput) com de peticions per segon, que permeten comprovar si l'uvloop millora les característiques de rendiment d'una aplicació concreta. L'uvloop és també un dels components sobre els quals es construeix Uvicorn, una implementació popular de la interfície ASGI.

Referències

Categoria:Python