баш для петлі паралельно з n ядрами


0

У мене є 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

Використовуйте паралель GNU:

seq 0 $max | parallel my_command {}

Як я можу змінити $ ncores з цією установкою?
drjrm3

-jX, де X - кількість завдань, які потрібно виконати паралельно. Він за замовчуванням визначає кількість ядер.
Оле Танге

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 %'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.