Use GNU Parallel:
seq 0 $max | parallel my_command {}
У меня есть bash
цикл, который выглядит так:
for i in $(seq 0 $max); do my_command $i done
и я хотел бы запустить это параллельно на n
ядрах. Я знаю, что я мог сделать
while [[ "$j" -le "$max" ]]; do for i in $(seq 1 $ncores); do my_command $j & done wait done
но если my_command
время выполнения линейно $i
, то я теряю циклы ЦП, ожидая самой продолжительной функции. Как я могу непрерывно отправлять новые задания, чтобы $ncores
задания выполнялись в любой момент времени? Нужно ли мне запускать настоящий планировщик заданий, например, torque
локально на моем компьютере, чтобы выполнить это, или я могу сделать это с помощью простого bash
сценария?
Use GNU Parallel:
seq 0 $max | parallel my_command {}
или используйте Xargs:
seq 1 $max | xargs -n1 -P$ncores -I% mycommand %
Чтобы увидеть, как это работает:
seq 1 9 | shuf | xargs -n1 -P3 -I% sh -c 'echo start %; sleep %; echo stop %'