Баш за петлю параллельно с ядрами

1153
drjrm3

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

0

2 ответа на вопрос

0
Ole Tange

Use GNU Parallel:

seq 0 $max | parallel my_command {} 
Как мне изменить $ ncores с этой настройкой? drjrm3 8 лет назад 0
-jX, где X - количество заданий, выполняемых параллельно. По умолчанию используется количество ядер. Ole Tange 8 лет назад 0
0
PBI

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

Похожие вопросы