Bash for Loop parallel mit n Kernen

1276
drjrm3

Ich habe eine bashSchleife, die wie folgt aussieht:

for i in $(seq 0 $max); do my_command $i done 

und ich möchte dies parallel auf nKernen ausführen . Ich weiß, dass ich das könnte

while [[ "$j" -le "$max" ]]; do for i in $(seq 1 $ncores); do my_command $j & done wait done 

Wenn jedoch my_commanddie Laufzeit linear ist $i, verschwenden ich CPU-Zyklen, indem ich auf die am längsten laufende Funktion warte. Wie kann ich ständig neue Aufträge senden, damit die $ncoresAufträge jederzeit ausgeführt werden? Muss ich dazu einen tatsächlichen Job-Scheduler ausführen, z. B. torquelokal auf meinem Computer, oder kann ich dies mit einem einfachen bashSkript tun ?

0

2 Antworten auf die Frage

0
Ole Tange

Verwenden Sie GNU Parallel:

seq 0 $max | parallel my_command {} 
Wie variiere ich $ ncores mit diesem Setup? drjrm3 vor 8 Jahren 0
-jX wobei X die Anzahl der parallel ausgeführten Jobs ist. Die Standardeinstellung ist die Anzahl der Kerne. Ole Tange vor 8 Jahren 0
0
PBI

oder benutze xargs:

seq 1 $max | xargs -n1 -P$ncores -I% mycommand % 

Um zu sehen, wie es funktioniert:

seq 1 9 | shuf | xargs -n1 -P3 -I% sh -c 'echo start %; sleep %; echo stop %'