2013-03-11 15 views
5

Ich habe Zugang zu einer Maschine, wo ich Zugang zu 10 der Kerne habe - und ich möchte sie tatsächlich benutzen. Was ich bin es gewohnt, auf meine eigene Maschine etwas zu tun, so sein würde:Bash: Das gleiche Programm über mehrere Kerne laufen lassen

for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" 
done 

Ich habe 10 Dateien Ich mag würde dies auf tun - nennen wir sie blah00.fa, blah01.fa, .. blah09.fa.

Das Problem mit diesem Ansatz ist, dass myProgram nur 1 Kern auf einmal verwendet, und so auf dem Multi-Core-Rechner würde ich 1 Kern zu einer Zeit 10 Mal verwenden, also würde ich nicht sein mit meinem Mahcine zu seiner maximalen Fähigkeit.

Wie kann ich mein Skript ändern, so dass es alle 10 meiner .fa-Dateien gleichzeitig ausführt? Ich schaute auf Run a looped process in bash across multiple cores, aber ich konnte nicht den Befehl bekommen, genau das zu tun, was ich wollte.

+2

Sie haben 'gnu parallel' versucht? Was hat nicht für dich funktioniert? –

+1

Haben Sie versucht, den Gnu-Parallelvorschlag in dieser Antwort zu verwenden? –

+2

'seq 0 10 | parallel myProgram -opt1 -opt2 ./blah{}.fa ./blah {}. tmp' –

Antwort

8

Sie

for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" & 
done 
wait 

verwenden könnte, die alle von Ihnen Aufträge parallel beginnen würde, dann warten Sie, bis sie alle komplett, bevor er auf. In dem Fall, in dem Sie mehr Jobs als Kerne haben, würden Sie alle starten und Ihren OS-Scheduler veranlassen, Prozesse in einem Out zu vertauschen.

Eine Änderung ist 10 Arbeitsplätze in einer Zeit

count=0 
for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" & 
    ((count ++))   
    if ((count = 10)); then 
     wait 
     count=0 
    fi 
done 

aber das ist schlechter als mit parallel gestartet werden, da Sie keine neuen Jobs als alte beenden beginnen können, und Sie können auch, wenn ein nicht erkennen Älterer Job beendet, bevor Sie 10 Jobs starten können. wait können Sie auf einen einzelnen bestimmten Prozess oder alle Hintergrundprozesse warten, aber lässt Sie nicht wissen, wenn einer beliebigen Hintergrundprozesse abgeschlossen ist.

+2

Nächste Version von Bash wird eine Option dafür haben (' wait -n' Momentan kannst du etwas wie [this] (https://gist.github.com/ormaaj/3911059) machen, aber es ist ein bisschen rassig wegen einiger Bugs, die auch in der nächsten Version behoben werden. – ormaaj

3

Haben Sie über die Verwendung von Parallel nachgedacht?

4

Mit GNU Parallel Sie tun können:

parallel myProgram (options) {} {.}.tmp ::: *.fa 

Von: http://git.savannah.gnu.org/cgit/parallel.git/tree/README

= Full Installation =

Vollständige Installation von GNU Parallel ist so einfach wie:

./configure && make && make install 

Wenn Sie nicht root sind, können Sie ~/bin zu Ihrem Pfad hinzufügen und in 012 installieren~/ist und ~/share:

./configure --prefix=$HOME && make && make install 

Oder wenn Ihr System fehlt 'make' Sie einfach src/parallel src/sem src/niceload src/SQL zu einem Verzeichnis in Ihrem Pfad kopieren.

= Minimal-Installation =

Wenn Sie nur parallel brauchen und nicht haben 'make' installiert ist (vielleicht das System ist alt oder Microsoft Windows):

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 
mv parallel sem dir-in-your-$PATH/bin/ 

Beobachten Sie die Intro-Videos zu lernen mehr: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

0
# Wait while instance count less than $3, run additional instance and exit 
function runParallel() { 
    cmd=$1 
    args=$2 
    number=$3 
    currNumber="1024" 
    while true ; do 
     currNumber=`ps -e | grep -v "grep" | grep " $1$" | wc -l` 
     if [ $currNumber -lt $number ] ; then 
      break 
     fi 
     sleep 1 
    done 
    echo "run: $cmd $args" 
    $cmd $args & 
} 

loop=0 
# We will run 12 sleep commands for 10 seconds each 
# and only five of them will work simultaneously 
while [ $loop -ne 12 ] ; do 
    runParallel "sleep" 10 5 
    loop=`expr $loop + 1` 
done 
Verwandte Themen