Подтвердить что ты не робот

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

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

#!/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 выполнялись в параллельно вместо одного за другим?

4b9b3361

Ответ 1

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

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

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

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

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 $< [email protected]

Ответ 2

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

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

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

Ответ 3

#!/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", внутри фигурных скобок на любое количество, которое вам нужно.

Ответ 4

вы можете использовать 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

Ответ 5

Вы можете использовать nohup ex:

nohup ex file1 r1 &    
nohup ex file2 r2 &
nohup ex file3 r3 &

Ответ 6

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

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

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

seq 1 3 | parallel ex file{} | combine

Подробнее о GNU Parallel, просмотрев http://www.youtube.com/watch?v=LlXDtd_pRaY

Ответ 7

xargs может сделать это:

seq 1 3 | xargs -n 1 -P 0 -I % ex file% r%

-n 1 предназначен для "одной строки на каждый вход", -P - для "запуска каждой строки параллельно"