Параллельная обработка или обработка потоков в сценарии оболочки

#multithreading #shell

#многопоточность #оболочка

Вопрос:

Я новичок в параллельной обработке. У меня есть несколько скриптов на Python, которые я не должен менять по некоторым причинам. Каждый из этих сценариев python использует только одно ядро процессора и выполняет некоторую обработку входного изображения. Я запускаю эти скрипты python с помощью сценария оболочки один за другим. Могу ли я выполнять параллельную потоковую обработку в сценарии оболочки без использования скриптов python, чтобы каждый скрипт python использовал несколько ядер процессора, а скорость обработки каждого изображения увеличивалась?

Ответ №1:

Да, запустите их с помощью GNU Parallel.

Итак, если вы хотите запустить свой скрипт 10 раз с параметрами 0 ..9:

 parallel python yourScript.py {} ::: {0..9}
  

Если вы хотите посмотреть, что будет выполняться без фактического запуска чего-либо:

 parallel --dry-run ...
  

Если вам нужен индикатор выполнения:

 parallel --progress ...
  

Комментарии:

1. Предположим, что я хочу запустить скрипт python только для одного изображения. Пока что этот скрипт python использует только одно ядро процессора для выполнения обработки этого изображения. Могу ли я вызвать этот скрипт python в сценарии оболочки определенным образом, чтобы он использовал более одного ядра процессора и выполнял обработку этого изображения быстрее? Работает ли ваш подход для моей проблемы?

2. Он не будет разделять изображение для вас, распределять части по процессорам, обрабатывать параллельно и рекомбинировать части. Однако, если у вас есть 8 изображений для обработки и 8 ядер процессора, вы приблизитесь к получению всех 8 изображений за время, которое обычно требуется — так что ваша пропускная способность будет в 8 раз больше, но ваша задержка до первого результата не изменится.

3. Если ваше изображение огромно, а ваша обработка чрезвычайно сложна, и обработка одной области изображения не зависит от других, возможно, стоит разделить изображение самостоятельно и запустить каждую часть через GNU Parallel, как указано выше, а затем рекомбинировать. Вам нужно будет значительно расширить детали в вашем вопросе.