[gull] Truc et astuces: multithread en bash

Daniel Cordey dc at pxcluster.com
Mon Dec 28 23:29:41 CET 2020


On 28/12/2020 21:44, felix wrote:
>
> Je m'attendais à cette remarque!

:-)


> Du point de vue du script lui même, il converse *effectivement* avec au moins
> deux thread indépendant: Les pings et l'utilisateur
>
>     $ cat -n multiping.sh | grep read\ -
>      18      read -u ${fds[$1]} -r line
>      55      if read -rsn 1 -t .2 key ;then
>      62          read -t 0 -u ${fds[i]} && pingInput $i

C'est juste là que notre vocabulaire diffère. Tu me diras qu'il s'agit 
d'une question de sémantique, mais elle a son importance (à mes yeux), 
car je vois trop de confusion de la part de plein de gens qui parlent de 
l'un en utilisant l'autre. C'est qu'il y a une différence fondamentale 
entre les deux et cette confusion entretenue fait que les gens pense que 
le multi-threading est la solution et ne réfléchissent jamais autrement. 
Dans ton cas, oui, tu lis (depuis le shell d'origine) le contenu d'un 
fichier, lui-même mis à jour par... un process et non un "thread" ! Un 
"thread" n'est pas un process et inversement. Et l'un n'est pas non plus 
le dérivé de l'autre.

En écrivant :

exec {fd} <(ping ...)

Tu fais un fork, suivit d'un exec du code /usr/bin/ping. Donc un autre 
PID -> autre process -> Pas un thread !

Ce qui est entre les deux (...) est un sub-shell, donc un autre process, 
et non un thread. Le problème vient sans doute d'un abus de langage très 
répandu dans la littérature qui parle de thread et de coroutines pour 
bash. Or, c'est à mon avis n'importe quoi. Les threads (en bash) sont 
tous des process séparés auxquels on attribue le mot de "thread", et les 
coroutines ne sont que ce que tu fais exactement dans ton script. Cette 
soit-disant vulgarisation apporte énormément d'ambiguïté et ne fait que 
répandre de faux concepts auprès des programmeurs. Tu mentionnes aussi 
la commande select() (system call, pas le 'select' de bash), qui est une 
composante essentielle dans le multi-processing. Or, bash, comme tu le 
dis, n'a pas cette commande et tu as justement développé une solution 
élégante pour t'en passer. Mais avec un vrai thread, on n'a pas besoin 
de passer par un fichier pour échanger les données, puisque l'on peut 
directement écrire dans la mémoire du process ayant initié le thread. 
C'est là qu'est toute la différence.

Le multi-threading répond à des besoins bien précis, alors que le 
multi-processing répond à d'autre besoins. Les deux sont complémentaires 
et ne doivent pas être confondus. Reste que bash offre beaucoup de 
facilité pour chaîner les process et, comme tu l'as démontré, qu'il est 
possible de synchroniser l'échange de données entre process (quoiqu'il 
s'agisse de polling dans ce cas et pas d'asynchronisme). Mais bash, n'a 
aucune capacité permettant à faire du multi-threading.

Ce que tu dis au sujet de l'espace disque avec de grosse quantités de 
données est juste. Ce fut aussi le sujet d'une discussion il y a 
quelques années à props du gain de performance en utilisant des pipes 
sur des systèmes multi-core :-)


A+

dc



More information about the gull mailing list