Как использовать все ядра с циклом for

У меня есть скрипт, который обрабатывает каждый файл в каталоге. Каждое выполнение djvu2pdf занимает много времени и использует только одно из моих четырех процессорных ядер:

for i in  *.djvu; do djvu2pdf "$i"; done

Чтобы ускорить общую обработку, я хочу запустить четыре процесса djvu2pdf параллельно.

Как мне изменить мой сценарий, чтобы я получал четыре конвейера вместо текущего одного конвейера?

Всего 2 ответа


Может быть, разветвление поможет тебе? Вы можете обернуть основную часть обработки в функцию, например, так

topdf() {
    local djvu_file=$1
    djvu2pdf "$djvu_file"
}

for i in  *.djvu; do topdf "$i" & done

Как видите, есть символ «&», который говорит, что операция должна быть отправлена ​​в фоновый режим.


С GNU Parallel :

parallel djvu2pdf ::: *.djvu

По умолчанию он запускает одно задание для каждого ядра ЦП, но вы можете установить больше или меньше заданий параллельно с parallel -j N где N - это parallel -j N число.

Вы также можете получить индикатор выполнения с parallel --bar ...

Вы также можете выполнить «пробный запуск», чтобы увидеть, что он будет делать, фактически ничего не делая с parallel --dry-run ...

Смотрите также здесь .


Есть идеи?

10000