Commande bloquante , est-elle vraiment utile ?
La notion de commande « bloquante » est une fonctionnalité de la plupart des langage de programmation multi-thread / multi-processus, en vue de mettre en attente d’une partie du code, un objet ou une méthode dans un temps précis ou sous certaines conditions. Classiquement, dans un programme d’uniprocessus, on peut trouver des fonctions bloquantes qui place la tâche dans une fil d’attente d’exécution. On rencontre aussi ce problème, soit en cas d’erreurs, soit dans une boucle infinie. En passant par des exemples d’application, je vais vous expliquer le principe de fonctionnement de certaines commandes bloquantes.
1. Qu’est-ce qu’une commande bloquante ?
En général, il s’agit d’un appel d’instruction qui vise à bloquer sa cible jusqu’à ce qu’il y un autre commande qui la libère. Prends un exemple sur la synchronisation des threads en Python :
Le principe general de ce type de instruction est d’assurer un seul thread ou processus executant en temps. Vous pouvez observer les effets de la classe Event dans le module « multithreading » avec Event.wait() qui joue un rôle de laisser bloquer des threads et Event.set() vise à les réveiller.
Un autre cas d’utilisation classique de commandes bloquantes est de mettre en attente un processus par un appel système qui le réveillera sur un évènement spécifique:
Dans cet exemple simple en JavaScript, l’affichage du ‘data’ sera exécuté dès que la lecture du fichier terminera. Enfin, une commande bloquante pour une opération E/S sera retournée de manière synchrone.
2. Pourquoi faut-il utiliser la commande de blocages ?
Une utilisation connue est la synchronisation générale. Comme j’ai déjà montré avant, on en a besoin dans la programmation parallèle et concurrente. Par exemple, en Python, le multiprocessing et multithreading nous fournissent des outils permettant de prévenir les conflits entre processus ou threads. Les classes « Lock », « RLock », « Semaphores », «Event », etc. .. sont créées dans ce but:
C’est une démonstration sur la fonction du Lock avec le threads, ce qui nous permette d’eviter le conflit parmi threads. Le code entre “lock.acquire()” et “lock.release()” est bloqué et n‘est jamais touché par les autres. Vous pouvez vous amuser aussi avec la réalisation de la synchronisation dans des langages différents (En Java, il existe un bloc synchronisé isolant uniquement quelques lignes du code ,ce qui parait très intéressant).
Il y a également des blocages causés par des fonctions spécifiques. La méthode « sleep() » de la classe « time » fait stopper une exécution pendant une période du temps, pendant laquelle le programme est bloqué (ou endormi).
3. Quelques remarques sur l’usage de la commande bloquante :
Il faut absolument faire attention lorsqu’on utilise des méthodes pour bloquer une partie de la programme. D’une part, ne manquez pas de fonctions nécessaires pour fermer ou lever un verrou, sinon il va causer un blocage infini ou une erreur. D’autre part, je vous conseille de bien comprendre la démarche des commandes bloquantes concernant la synchronisation afin d’éviter les erreurs.
En plus, ces commandes lèvent souvent des exceptions à capter, donc vous avez besoin d’y prendre garde.
Il est possible d’implémenter un mécanisme de `timeout` pour relancer l’exécution dans le cas où la fonction resterait bloquée trop longtemps.
Au final, certains langages supportent des fonctions de rappel (Call-back), qui sont associées à une commande bloquante et permettent d’en traiter le résultat.
4. Conclusion :
Je viens de vous expliquer brièvement une des notions importantes pour les développeurs débutants en programmation: les fonctions bloquantes. En se l’appropriant, il vous et possible de découvrir un nombre de nouvelles choses et d’éviter des erreurs inadmissibles.
C’est pourquoi, Faites comprendre désormais l’utilisation de la commande bloquante afin de l’appliquer dans votre code. Rappelez-vous bien que si on met en place un blocage sur une partie du code, elle devra attendre d’être relancée, soit par l’autorisation d’une fonction particulière, soit par ou par une exception.
Chaque langage implémente différemment ces mécanismes de blocage, pour des cas d’usages très variés. Vous trouverez ci-après plusieurs liens utiles pour creuser le sujet, et mieux maîtriser cette notion.
5. Sources :