Comment faire du MultiThreading en BASH…. En fait c’est assez simple, il suffit des mettre les scripts en arrière-plan et d’attendre qu’ils soient terminés. Bien sûr, il peut exister certaines limitations…. C’est un non-sens de mettre 20 scripts en parallèle quand il n’y a que 4 processeurs….
Donc pour gérer efficacement le multi-Threading”, personnelemen,t je limite le nombre de threads au nombre de processeurs…..
Voici une manière simple de gérer le multithreading :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#-------------------------------------------------- # Get the maximum physical Threads function JobMaxPhysicalThreads() { echo $(grep -c proc /proc/cpuinfo) } #-------------------------------------------------- #-------------------------------------------------- # Is Max Threads count reached ? If yes, wait.... function JobOngoingThreads() { # How many jobs in Background now ? echo $(jobs|grep -vi "done"|wc -l) } #-------------------------------------------------- #-------------------------------------------------- # Is Max Threads count reached ? If yes, wait.... function JobMaxThreadsReachedWait() { # How many jobs in Background now ? JobsInBackGround=$(JobOngoingThreads) # Is background processes limit reached ? if [[ $JobsInBackGround -gt $nThreadsLimit ]]; then # Wait until some slots are available while [[ $JobsInBackGround -gt $nThreadsLimit ]] do sleep 1 JobsInBackGround=$(JobOngoingThreads) done fi } #-------------------------------------------------- |
Dans le script lui-même avant d’envoyer un nouveau script en arrière-plan, il suffit de vérifier si le nombre de scripts en arrière-plan n’a pas atteint la limite, si oui, alors il suffit d’attendre qu’il y ait un slot de disponible…
Par exemple :
1 2 3 4 |
## Check Current Number of Threads...in case, max is reached, wait ! JobMaxThreadsReachedWait ## Launch next Thread LaunchNewScript |