запустить команду в нескольких потоках

472
sanjihan

Я запускаю команду (pngquant, чтобы быть точным: https://github.com/pornel/pngquant ) в окне терминала. Я заметил, что если я открою 4 окна терминала и введу команду pngquant в каждом из них, я получу увеличение скорости в 4 раза, эффективно сжимая в 4 раза больше изображений за то же время, что и раньше.

Поэтому я использовал этот подход и назначил каждому процессу pngqunat часть изображений, которые я хочу сжать, эффективно создав несколько процессов в нескольких потоках.

Можете ли вы выполнить команду в нескольких потоках, не выполняя этих трюков, которые я делал? Я хотел бы просто сказать «запустить сжатие pngquant для всех этих изображений и использовать все доступные потоки».

2
Вы можете использовать "параллель". simlev 6 лет назад 4

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

1
simlev

Расширяя мой предыдущий комментарий в ответ.

Gnu Parallels - это инструмент командной строки, предназначенный для одновременного выполнения заданий, в котором используются несколько потоков, ядер, процессоров, ПК. xargs теперь предлагает аналогичную функциональность с добавлением -Pпереключателя.

Я провел для вас тест на двухъядерном VPS, используя pngquantдля конвертации кучу .pngфайлов (126 изображений в среднем размером 9 МБ).

pngquant *.png заняло 26 минут.

find . -iname "*.png" | parallel pngquant {} заняло 14 минут.

topпоказывает параллельное выполнение двух pngquantкоманд одновременно:

 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5808 user 20 0 70948 59164 2140 R 100.0 2.9 0:03.49 pngquant 5811 user 20 0 70952 61000 2024 R 99.3 3.0 0:05.67 pngquant 
0
A. Loiseau

Вы ищете точно такую ​​же систему, которая требуется для этого недавнего вопроса . Полученный ответ (сценарий на основе Python) будет идеально соответствовать вашим потребностям, если его немного адаптировать для более простого случая.

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