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 :
#--------------------------------------------------
# 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 :
## Check Current Number of Threads...in case, max is reached, wait ! JobMaxThreadsReachedWait ## Launch next Thread LaunchNewScript
