Async/await és un patró de programació asíncrona present en diversos llenguatges de programació moderns que permet estructurar operacions no bloquejants mitjançant una sintaxi similar a la de la programació síncrona. Aquest enfocament facilita la lectura del codi i simplifica la gestió de tasques de concurrència, especialment en aplicacions amb operacions d’entrada/sortida.
Funcionament
El model async/await es basa en la definició de funcions asíncrones mitjançant la paraula clau async, així com en l’ús de l’expressió await, que permet suspendre temporalment l’execució d’una funció fins que una operació asíncrona es completa. Durant aquest temps, el fil d’execució no queda bloquejat, sinó que pot continuar executant altres tasques.
Aquest comportament es gestiona habitualment mitjançant un bucle d'esdeveniments (event loop), que coordina l’execució de múltiples tasques asíncrones. Quan una funció arriba a una expressió await, el control es retorna al bucle d’esdeveniments, que pot decidir executar altres tasques pendents fins que la primera es reprèn.
Concurrència
El patró async/await permet implementar concurrència sense necessitat de paral·lelisme. Diverses operacions poden estar en curs al mateix temps, però s’executen de manera cooperativa dins d’un únic fil d’execució. Aquesta concurrència es basa en la capacitat de suspendre i reprendre tasques en punts concrets, normalment associats a operacions d’entrada/sortida o esperes temporals.
Aquest model s’utilitza habitualment en entorns on és important evitar el bloqueig del sistema, com ara aplicacions web, servidors de xarxa o interfícies d’usuari.
Relació amb altres conceptes
El patró async/await està estretament relacionat amb conceptes com les coroutines, que representen funcions capaces de suspendre i reprendre la seva execució. També es vincula amb estructures com les promeses o els futures, que encapsulen el resultat d’una operació que es completarà en el futur.
En molts llenguatges, async/await es construeix sobre mecanismes previs de gestió d’operacions asíncrones, com ara callbacks o promeses, però ofereix una sintaxi més clara i estructurada.
Implementacions
Diversos llenguatges de programació incorporen suport per al patró async/await. En Python, es troba disponible a partir de la versió 3.5 a través del mòdul asyncio, que proporciona eines per a la gestió de tasques, temporitzadors i operacions d’entrada/sortida asíncrones.
En JavaScript, async/await es basa en el model de promeses i forma part de l’estàndard ECMAScript des de 2017. Altres llenguatges com C#, Kotlin o Swift també incorporen mecanismes similars per a la programació asíncrona.
Exemple
En Python, una funció asíncrona es defineix amb la paraula clau async i pot utilitzar await per suspendre la seva execució:
import asyncio async def tasca(): await asyncio.sleep(1) return "Completat" async def main(): resultat = await tasca() print(resultat) asyncio.run(main())
Avantatges i limitacions
L’ús d’async/await facilita la lectura i manteniment del codi en comparació amb altres models basats en callbacks. A més, permet evitar el bloqueig del fil principal en operacions lentes.
Tanmateix, aquest model pot resultar complex per a programadors sense experiència en concurrència i requereix una gestió adequada de les tasques pendents. Un ús incorrecte pot provocar problemes difícils de detectar, com ara condicions de carrera o bloquejos lògics.