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.Documentació oficial de Python: asyncio, https://docs.python.org/3/library/asyncio.html 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ó.Matthew Fowler, Python Concurrency with asyncio, Manning, 2022. 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.MDN Web Docs, JavaScript async/await, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 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.

Vegeu també bucle d'esdeveniments programació asíncrona concurrència corutina

Referències

Categoria:Programació