У меня есть цикл 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 ?

2 ответа2

0

или используйте 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 %'
0

Используйте GNU Parallel:

seq 0 $max | parallel my_command {}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .