Как использовать параллельное выполнение в сценарии оболочки?

У меня есть сценарий оболочки C, который делает что-то вроде этого:

#!/bin/csh
gcc example.c -o ex
gcc combine.c -o combine
ex file1 r1     <-- 1
ex file2 r2     <-- 2
ex file3 r3     <-- 3
#... many more like the above
combine r1 r2 r3 final
\rm r1 r2 r3

Есть ли некоторый способ, которым я могу сделать строки 1, 2 и 3 выполненный параллельно вместо одного после другого?

19
задан Lazer 7 May 2010 в 19:15
поделиться

5 ответов

Преобразуйте его в файл Makefile с соответствующими зависимостями. Затем вы можете использовать make -j, чтобы Make запускал все возможное параллельно.

Обратите внимание, что все отступы в Makefile должны быть TABs. Tab показывает Создать, где находятся команды для выполнения.

Также обратите внимание, что этот Makefile теперь использует расширения GNU Make (функции подстановочных знаков и subst).

Это может выглядеть так:

export PATH := .:${PATH}

FILES=$(wildcard file*)
RFILES=$(subst file,r,${FILES})

final: combine ${RFILES}
    combine ${RFILES} final
    rm ${RFILES}

ex: example.c

combine: combine.c

r%: file% ex
    ex $< $@
13
ответ дан 30 November 2019 в 04:11
поделиться

вы можете использовать cmd & и подождать после

#!/bin/csh
echo start
sleep 1 &
sleep 1 &
sleep 1 &
wait
echo ok

теста:

$ time ./csh.sh 
start
[1] 11535
[2] 11536
[3] 11537
[3]    Done                   sleep 1
[2]  - Done                   sleep 1
[1]  + Done                   sleep 1
ok

real    0m1.008s
user    0m0.004s
sys 0m0.008s
3
ответ дан 30 November 2019 в 04:11
поделиться

В bash я бы сделал;

ex file1 r1  &
ex file2 r2  &
ex file3 r3  &
wait
... continue with script...

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

8
ответ дан 30 November 2019 в 04:11
поделиться
#!/bin/bash

gcc example.c -o ex
gcc combine.c -o combine

# Call 'ex' 3 times in "parallel"
for i in {1..3}; do
  ex file${i} r${i} &
done

#Wait for all background processes to finish
wait

# Combine & remove
combine r1 r2 r3 final
rm r1 r2 r3

Я немного изменил код, чтобы использовать расширение фигурных скобок {1..3} вместо жесткого кодирования чисел, поскольку я только что понял, что вы сказали, что файлов гораздо больше, чем просто 3. Расширение фигурных скобок делает масштабирование до большие числа тривиально, заменяя «3» внутри фигурных скобок на любое нужное вам число.

5
ответ дан 30 November 2019 в 04:11
поделиться

GNU Parallel сделает это примерно так:

seq 1 3 | parallel ex file{} r{}

В зависимости от того, как работают 'ex' и 'combine', вы можете даже сделать:

seq 1 3 | parallel ex file{} | combine

Узнайте больше о GNU Parallel, посмотрев http://www.youtube.com/watch?v=LlXDtd_pRaY

0
ответ дан 30 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

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