У меня есть сценарий оболочки 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
выполненный параллельно вместо одного после другого?
Преобразуйте его в файл 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 $< $@
вы можете использовать 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
В bash я бы сделал;
ex file1 r1 &
ex file2 r2 &
ex file3 r3 &
wait
... continue with script...
и запустил их для параллельной работы. Вы можете проверить эту ветку SO для другого примера.
#!/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» внутри фигурных скобок на любое нужное вам число.
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