La protecció de tasques és un mecanisme de la programació asíncrona que permet evitar que una tasca o operació crítica sigui cancel·lada de manera indirecta quan es cancel·la la tasca que l'estava esperant. Aquest concepte és especialment rellevant en entorns basats en corutines, on diverses operacions poden executar-se de manera concurrent i compartir un mateix bucle d'esdeveniments.

En biblioteques com de Python, la protecció de tasques s'associa habitualment amb la funció , que permet protegir un objecte esperable davant de la cancel·lació externa. Això no impedeix que la tasca protegida pugui ser cancel·lada directament, però evita que la cancel·lació de la corutina que l'espera es propagui automàticament cap a ella.

La protecció de tasques s'utilitza quan una operació ja iniciada ha d'arribar a un punt segur abans de poder-se interrompre. És habitual en programes que treballen amb xarxa, bases de dades, cues de missatges o serveis remots, on una cancel·lació sobtada pot deixar dades a mig escriure o recursos en un estat inconsistent.

Funcionament En programació asíncrona, una tasca pot estar esperant el resultat d'una altra operació mitjançant una expressió d'espera, com ara . Si la tasca principal és cancel·lada, aquesta cancel·lació pot propagar-se a l'operació que estava esperant. En molts casos, aquest comportament és desitjable, ja que permet alliberar recursos i evitar que el programa continuï fent una feina que ja no és necessària.

Tanmateix, hi ha operacions que no convé interrompre un cop han començat. Per exemple, una aplicació pot haver iniciat una escriptura en una base de dades, l'enviament d'un missatge o la confirmació d'una transacció. Si aquestes operacions s'aturen en un punt intermedi, el sistema pot quedar en un estat difícil de recuperar.

La protecció de tasques introdueix una separació entre la cancel·lació de la tasca que espera i la cancel·lació de l'operació protegida. D'aquesta manera, si la tasca externa rep una ordre de cancel·lació, pot deixar d'esperar el resultat, però l'operació interna pot continuar fins a completar-se. Aquest comportament és útil quan la finalització de l'operació és necessària per mantenir la coherència del sistema.

Ús en operacions crítiques La protecció de tasques s'utilitza sobretot en operacions que tenen efectes externs o que no es poden revertir fàcilment. Alguns exemples habituals són l'escriptura de dades en una base de dades, l'enviament d'un correu electrònic, la publicació d'un missatge en una cua, la confirmació d'una transacció o el tancament ordenat d'una connexió.

En una aplicació web asíncrona, per exemple, un client pot tancar la connexió abans que el servidor hagi acabat una operació interna. Si aquesta operació consisteix només a calcular una resposta, pot ser raonable cancel·lar-la. En canvi, si consisteix a confirmar una comanda o registrar una operació de pagament, pot ser necessari protegir-la perquè acabi correctament encara que el client ja no esperi la resposta.

També pot ser útil durant una aturada ordenada. Quan una aplicació rep una ordre de tancament, pot cancel·lar moltes tasques pendents, però mantenir protegides aquelles que estan executant una acció crítica de neteja, confirmació o alliberament de recursos.

Relació amb la cancel·lació de tasques La protecció de tasques no elimina la necessitat de gestionar correctament la cancel·lació. Una tasca protegida encara pot ser cancel·lada si es cancel·la directament o si el programa decideix interrompre-la explícitament. Per això, la protecció s'ha d'entendre com una eina de control de propagació de cancel·lacions, no com una garantia absoluta que una operació acabarà sempre.

Aquest mecanisme sol combinar-se amb blocs de neteja, temps d'espera i aturada ordenada. Els blocs de neteja, com , permeten alliberar recursos encara que una tasca sigui interrompuda. Els temps d'espera eviten que una operació protegida pugui quedar executant-se indefinidament. D'aquesta manera, la protecció de tasques forma part d'una estratègia més àmplia de robustesa en programes concurrents.

En el cas d', la cancel·lació d'una tasca es comunica mitjançant una excepció específica. Això permet que la corutina executi codi de neteja abans de finalitzar. La protecció de tasques modifica només la manera com aquesta cancel·lació es propaga entre tasques relacionades.

Diferència amb ignorar una cancel·lació Protegir una tasca no és el mateix que ignorar completament una cancel·lació. Ignorar una cancel·lació pot fer que el programa sigui menys controlable i que l'aturada de l'aplicació sigui més lenta o imprevisible. En canvi, la protecció de tasques s'aplica normalment a una operació concreta i justificada, amb l'objectiu que aquesta arribi a un estat segur.

Un bon ús d'aquest mecanisme implica identificar quines parts del programa són realment crítiques i limitar la protecció a aquests casos. Si totes les tasques es protegeixen indiscriminadament, es perd un dels avantatges principals de la cancel·lació: poder aturar ràpidament el treball que ja no és necessari.

Limitacions L'ús excessiu de la protecció de tasques pot dificultar el control global d'una aplicació. Si massa operacions queden protegides contra la cancel·lació, el programa pot trigar més a aturar-se o mantenir tasques actives que ja no són necessàries. Per aquest motiu, s'acostuma a reservar aquest mecanisme per a operacions realment crítiques.

També cal tenir en compte que protegir una tasca no resol automàticament problemes com interbloquejos, errors de xarxa, fallades del servei extern o inconsistències de disseny. La protecció només modifica la manera com es propaga la cancel·lació; la gestió dels errors i la coherència de les dades continua sent responsabilitat del disseny de l'aplicació.

En sistemes distribuïts, una operació protegida pot completar-se localment però fallar en un servei extern. Per això, sovint es combina amb altres mecanismes, com transaccions, operacions idempotents, registres d'activitat o patrons de reintent.

Vegeu també Corutina Bucle d'esdeveniments Aturada ordenada Tolerància a fallades

Referències

Categoria:Programació