이 루프를 병렬로 만드는 방법:
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 '@'