La commutació de context cooperativa (en anglès, cooperative context switch) és el mecanisme pel qual una tasca o corutina cedeix voluntàriament el control al planificador en punts explícits del codi, permetent que altres tasques s'executin. Es contraposa a la multitasca apropiativa, en la qual és el sistema operatiu qui interromp les tasques arbitràriament.

Funcionament En un model de multitasca cooperativa, cap tasca no és interrompuda per un agent extern. En lloc d'això, cada tasca és responsable de cedir el control quan no necessita el processador, típicament en esperar el resultat d'una operació d'entrada/sortida. Aquest model s'anomena "cooperatiu" perquè totes les tasques han de col·laborar activament cедint el control perquè el sistema funcioni correctament: si una tasca mai cedeix el control, monopolitza el fil d'execució i bloqueja la resta.

La commutació de context cooperativa té menys sobrecàrrega que la preemptiva, perquè no requereix la intervenció del nucli del sistema operatiu ni la preservació completa del context del processador. El canvi de context es produeix en punts deterministes i coneguts pel programador, cosa que fa el comportament del sistema més fàcil de raonar.

Ús en asyncio En Python, asyncio utilitza la commutació de context cooperativa com a mecanisme fonamental. El bucle d'esdeveniments executa una sola tasca a la vegada. Quan una corutina arriba a una expressió await, cedeix el control al bucle d'esdeveniments, que pot reprendre una altra tasca que estigui preparada per continuar. Quan l'operació esperada finalitza, el bucle d'esdeveniments reprogramar la corutina original perquè continuï des del punt on s'havia aturat.

Aquest disseny implica una regla fonamental: qualsevol operació que no contingui un await s'executa sense interrupció. Per tant, una funció de càlcul intens que no cедeixi mai el control bloquejarà el bucle d'esdeveniments i impedirà que totes les altres corutines avancin.

Avantatges i limitacions Entre els avantatges destaquen la simplicitat de la sincronització (no calen verrous per a la majoria de casos), l'eficiència (menys canvis de context), i el comportament determinista del codi. Com a limitació principal, el programador ha d'assegurar-se que cap corutina monopolitza el fil; en cas contrari, cal delegar el treball intensiu a un executor en un fil o procés separat.

Vegeu també Multitasca cooperativa Bucle d'esdeveniments Corutina Multitasca apropiativa

Referències

Fowler, M. (2022). Python Concurrency with asyncio. Manning Publications. Capítol 1, seccions 1.3.4 i 1.3.5.