Una crida no bloquejant és una operació de programari que retorna el control al programa sense esperar indefinidament que l'operació demanada hagi acabat. El terme s'utilitza sobretot en entrada/sortida, xarxes i sistemes concurrents. En una crida bloquejant, si una operació no pot continuar immediatament, el fil o procés queda aturat fins que hi ha dades disponibles, espai per escriure o algun altre esdeveniment necessari. En una crida no bloquejant, en canvi, l'operació retorna de seguida: pot completar-se, avançar parcialment o indicar que encara no es pot fer.
Funcionament En sistemes POSIX, alguns descriptors de fitxer poden obrir-se o configurar-se amb l'opció O_NONBLOCK. Quan aquesta opció és activa, les operacions posteriors d'E/S sobre el descriptor no han de fer esperar el procés si l'operació no pot progressar immediatament. En el cas dels sòcols, això permet intentar llegir, escriure, acceptar una connexió o connectar-se sense deixar aturat el fil principal.
El resultat d'una crida no bloquejant pot ser diferent segons l'operació i el sistema. Una lectura pot retornar dades disponibles encara que siguin menys de les demanades; una escriptura pot acceptar només una part del búfer; i una operació que encara no pot avançar pot retornar un error temporal. Per això, el programa ha de conservar l'estat de l'operació i reprendre-la quan sigui possible.
Una crida no bloquejant normalment s'acompanya d'algun mecanisme per saber quan val la pena tornar-ho a provar. Per això sovint es combina amb multiplexació d'E/S, com select, poll, epoll o kqueue, que permeten vigilar diversos descriptors i rebre una notificació quan algun està preparat.
Ús Les crides no bloquejants són habituals en servidors de xarxa, interfícies gràfiques i aplicacions que han de continuar responent mentre esperen dades externes. Eviten que una sola operació lenta aturi tot el programa i faciliten arquitectures basades en bucles d'esdeveniments. També permeten gestionar moltes connexions amb pocs fils, perquè el programa pot alternar entre operacions preparades en lloc de dedicar un fil bloquejat a cada connexió.
En Python, els sòcols poden configurar-se en mode no bloquejant amb setblocking(False); la documentació del mòdul socket també relaciona aquest mode amb els temps d'espera.
Limitacions Una crida no bloquejant no fa que l'operació sigui automàticament més ràpida. El programa ha de gestionar els intents pendents, errors temporals, resultats parcials i notificacions de disponibilitat. Si es comprova repetidament l'estat sense esperar notificacions, es pot caure en espera activa i consumir CPU innecessàriament. Per això, en sistemes grans, les crides no bloquejants solen formar part d'una arquitectura més àmplia amb selectors, cues o bucles d'esdeveniments.
Referències
Categoria:Enginyeria de programari