Verwenden Sie GNU Parallel:
seq 0 $max | parallel my_command {}
Ich habe eine bash
Schleife, die wie folgt aussieht:
for i in $(seq 0 $max); do my_command $i done
und ich möchte dies parallel auf n
Kernen 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_command
die 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 $ncores
Aufträge jederzeit ausgeführt werden? Muss ich dazu einen tatsächlichen Job-Scheduler ausführen, z. B. torque
lokal auf meinem Computer, oder kann ich dies mit einem einfachen bash
Skript tun ?
Verwenden Sie GNU Parallel:
seq 0 $max | parallel my_command {}
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 %'