병렬 루프 만들기

병렬 루프 만들기

이 루프를 병렬로 만드는 방법:

for a in $(seq 1 3)
do
  for b in 0.1 0.2 
  do
    echo process with a=$a and b=$b &
  done
done

병렬인가 아닌가? 실제로 echo process with a=$a and b=$b각 값 조합에 대해 명령을 병렬로 실행 하고 싶은데 위 셸을 a실행 b 한 결과는 다음과 같습니다.

process with a=1 and b=0.1
process with a=2 and b=0.2
process with a=2 and b=0.1
process with a=3 and b=0.2
process with a=3 and b=0.1
process with a=1 and b=0.2

감사해요.

답변1

GNU Parallel을 사용하면 다음과 같습니다:

parallel echo process with a={1} and b={2} ::: 1 2 3 ::: 0.1 0.2 
seq 1 3 | parallel echo process with a={1} and b={2} :::: - ::: 0.1 
parallel echo process with a={1} and b={2} :::: <(seq 1 3) ::: 0.1 0.2

병렬화 는 가치가 거의 없기 echo때문에 이것은 단지 예일 뿐이라고 생각합니다 .echo

답변2

내부 루프에서 시간이 걸리는 무언가를 실행하는 경우( echo예:실행), 루프가 시작되면 모든 비동기 프로세스가 실행됩니다.동시에.

루프 자체는 "병렬"이 아닙니다.

답변3

리뷰를 해야 하는데 너무 적습니다.

솔루션이 모든 크기의 출력에 대해 작동하고 한 작업의 출력을 다른 작업의 출력과 혼합하지 않는지 확인하십시오. 테스트할 작은 예는 다음과 같습니다.

#!/bin/bash                                                                               

# stress test of parallelizing programs                                                   

longline() {
    # print one big line with 'a's followed by 'b's followed by 'c's                      
    perl -e 'print "@ARGV ", map { "$_"x10000000 } (a..c)' "$@"
    echo
}


echo "Run testprogram in parallel"
for a in $(seq 1 3)
do
    for b in 0.1 0.2
    do
        longline $a $b &
    done
done |
# use 'tr' to compress many 'a's into a single 'a'                                        
# if the output is not 'abc' on every line, lines have been mixed                         
  tr -cs '@'

echo "Run testprogram in serial"
for a in $(seq 1 3)
do
    for b in 0.1 0.2
    do
        longline $a $b
    done
done | tr -cs '@'


echo "Compare with GNU Parallel"
export -f longline
parallel -kj0 longline :::: <(seq 1 3) ::: 0.1 0.2 | tr -cs '@'

관련 정보