Zakhar a écritC'est un "bashism" qu'une fonction soit parallélisée ?
La fonction que je souhaite parallélisé est une fonction socle dans mon script, reprise plein de fois.
Rien empêche de créer des scripts externe et de "sourcer" (du style ". /mes_fonctions.sh") sur ma librairie maison mais je trouve que c'est ce compliqué la vie.
Zakhar a écrit
Pour paralléliser il faut relancer ton script lui-même avec le & à la fin.
Aussi tu ne peux pas dans ce cas récupérer le résultat dans une variable puisque le "résultat" est en fait le stdout. Donc si tu attends le stdout du fils, de fait tu n'as plus de parallélisme.
Donc pour faire ce que tu désires, la sortie des fils doit être mis dans des fichiers, et il faut ensuite relire les fichiers pour voir ce qu'il y a dedans.
Okay, je comprends je n'avais pas la bonne logique.
Je créé des fils qui font leurs vies tout seul mais le point de blocage était au moment de l'affectation sur le processus père : retour_fils1=$((fils1) &)
D'ailleurs, je n'avais pas bien fait attention, en mode débug, on remarque que cela se bloque au niveau de l'affectation. La première affectation se déroule assez rapidement puis après il y a temporisation pour attendre l'affectation suivante pour le fils2.
Et après reflexion, cela me permet logique, une fois retourné chez le père, toutes les commandes synchrone et donc c'est normal que l'on attende le résultat des commandes les uns après les autres.
Il faudrait dans ce cas, créé les fils et c'est ensuite au père de regarder l'état de ses fils, cela doit être de l'initiative du père. Et non pas l'inverse du fils au père
Comme tu me l'a conseillé, je suis donc passé par un fichier pour que le père puisse récupérer l'état des fils
Le nouveau code :
function fils1() {
export FILS=FILS1
sleep 5
echo "FIN FILS1" 1>tmp/fils1
}
function fils2() {
export FILS=FILS2
sleep 10
echo "FIN FILS2" 1>tmp/fils1
}
(fils1) & 1>tmp/fils1
(fils2) & 1>tmp/fils2a
while true
do
if [[ $(cat tmp/fils1) = "FIN FILS1" ]]
then
retourFils=$(cat tmp/fils1)
echo "fin fils1, je sors"
break
elif [[ $(cat tmp/fils2) = "FIN FILS2" ]]
then
retourFils=$(cat tmp/fils2)
echo "fin fils2, je sors"
break
fi
done
echo "PERE : fils reour : $retourFils"
echo "variable en : $FILS"
Le code est donné pour exemple, utiliser des break par exemple n'est pas propre du tout.
Et voilà le résultat
xbionic@bionic:~/Documents/script/$ bash multi_process.sh
fin fils1, je sors
PERE : fils reour : FIN FILS
variable en :
On remarque cette fois-ci que l'on a tout de suite, le résultat de FILS1 et après on sort.
J'ai voulu tester avec les variables d'environnements mais malheureusement les sous shell des fils sont bien hermétiques.
Zakhar a écrit
Après tu peux jouer avec les fonctions de "job" pour inspecter les fils terminés et ceux qui sont en cours et réagir en conséquence.
Cela pourrait être une solution plus propre mais malheureusement dans mon cas, je souhaite récupérer des coordonnées et celles-ci dépassent quasiment tout le temps les 255. Et je crois que l'on est limité à ce nombre dans le exit 🙁
Bref la seule est de passer par des fichiers, ce n'est pas très propre mais bon il semblerait que ce soit le seul moyen.