Вызывает ли выполнение сценариев через цикл for в файле Bash их однопоточность? - PullRequest
3 голосов
/ 02 июля 2019

У меня есть Bash-скрипт, который я отправляю в кластер, который вызывает конвейер Python-скриптов, которые созданы для многопоточности для параллельной обработки. Мне нужно вызвать этот конвейер для всех файлов в каталоге, что я могу сделать с помощью цикла for. Однако я обеспокоен тем, что при этом операции (т. Е. Конвейер) будут выполняться только в однопоточном режиме, а не во всем предполагаемом диапазоне.

Пакетный файл для отправки выглядит так:

#!/bin/bash
##SBATCH <parameters>

for filename in /path/to/*.txt; do
    PythonScript1.py "$filename"
    PythonScript2.py "$filename"
done

Будет ли это работать по назначению, или цикл for будет препятствовать эффективности / параллельной обработке скриптов Python?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Если вы работаете на одном сервере:

parallel ::: PythonScript1.py PythonScript2.py ::: /path/to/*.txt

Это сгенерирует все комбинации {PythonScript1.py, PythonScript2.py} и *.txt.Эти комбинации будут выполняться параллельно, но параллельная версия GNU будет работать только столько раз, сколько имеется потоков ЦП на сервере.

Если вы работаете на нескольких серверах в кластере, это действительно зависит от того, какая системаиспользуется для управления кластером.В некоторых системах вы запрашиваете список серверов, а затем можете использовать ssh:

get list of servers > serverlist
parallel --slf serverlist ::: PythonScript1.py PythonScript2.py ::: /path/to/*.txt

В других вы должны дать каждой из команд, которые вы хотите выполнить, системе очередей:

parallel queue_this ::: PythonScript1.py PythonScript2.py ::: /path/to/*.txt

Не зная больше о том, какая система управления кластером используется, вам трудно помочь вам больше.

2 голосов
/ 03 июля 2019

Как изначально написано, PythonScript2.py не будет работать до тех пор, пока не вернется PythonScript1.py, а цикл for не будет повторяться, пока не вернется PythonScript2.py.

Обратите внимание, что я сказал "возвращается",не "заканчивает";если PythonScript1.py и / или PythonScript2.py fork s или иным образом уходит в фон самостоятельно, то он вернется до завершения и продолжит обработку, пока вызывающий скрипт bash перейдет к следующему шагу.

Вы можете сделать так, чтобы вызывающий скрипт поместил их в фоновый режим с помощью PythonScript1.py & и PythonScript2.py &, но это может или не может быть тем, что вы хотите, так как PythonScript1.py и PythonScript2.py таким образом (вероятно) будутвыполняется одновременно.

Если вы хотите, чтобы несколько файлов обрабатывались одновременно, но хотите, чтобы PythonScript1.py и PythonScript2.py выполнялись в строгом порядке, следуйте комментарию Уильяма Перселла:

for filename in /path/to/*.txt; do
    { PythonScript1.py "$filename"; PythonScript2.py "$filename"; } &
done
...