Gnu 병렬성을 사용하는 스크립트가 있습니다. 각 "반복"에 대해 두 개의 매개변수를 전달하고 싶습니다.
직렬 실행에는 다음과 같은 것이 있습니다.
for (( i=0; i<=10; i++ ))
do
a = tmp1[$i]
b = tmp2[$i]
done
나는 그것을 병렬화하고 싶다.
func pf()
{
a=$1
b=$2
}
export -f pf
parallel --jobs 5 --linebuffer pf ::: <what to write here?>
답변1
집중을 유지하기 위해 다른 parallel
플래그를 생략하는 중...
parallel --link pf ::: A B ::: C D
먼저 다음을 a=A
사용하여 함수를 b=C
실행합니다 .a=B
b=D
a=A b=C
a=B b=D
그렇지 않으면 --link
다음과 같은 완전한 조합을 얻을 수 있습니다.
a=A b=C
a=A b=D
a=B b=C
a=B b=D
고쳐 쓰다:Ole Tange가 댓글에서 언급했듯이 [삭제됨 -에드.] 이를 수행하는 또 다른 방법이 있습니다: :::+
연산자를 사용하는 것입니다. 그러나 이 두 가지 옵션에는 중요한 차이점이 있습니다.만약에매개변수 위치마다 매개변수 개수가 동일하지 않습니다. 설명하기 위해 예를 들어보세요.
parallel --link pf ::: A B ::: C D E
산출:
a=A b=C
a=B b=D
a=A b=E
parallel pf ::: A B :::+ C D E
산출:
a=A b=C
a=B b=D
따라서 --link
모든 매개변수가 소비되도록 "래핑"되고 :::+
추가 매개변수는 무시됩니다. (일반적인 경우 --link
대안은 입력을 자동으로 무시하는 것이기 때문에 나는 그것을 선호합니다. YMMV.)
답변2
단순화하기 위해 bash를 가정하고 배열의 인덱스는 0이 아닌 1부터 지정됩니다. 다음과 같은 작업을 수행하는 것이 직관적인 것 같습니다.
parallel ... pf '$tmp1[{#}]' '$tmp2[{#}]' ::: $(seq 10)
함수의 두 매개변수가 pf
명령의 일부인 경우 병렬 표기법을 사용하여 작업 번호를 나타냅니다(10개 작업의 경우 1에서 10까지 설정). 나중에 10개 작업을 실행하려면 10개 매개변수 {#}
만 가져오면 됩니다 ( seq 값은 사용되지 않으며 작업 번호와 동일하게 발생합니다.)seq
:::
불행히도 bash는 배열 변수를 내보내지 않기 때문에 작동하지 않습니다. 그러나 함수를 내보낼 수 있으며 매뉴얼 페이지에는 parallel
선택한 함수를 내보내거나 가져오는 간단한 함수를 사용하여 선택한 배열 변수를 설정하는 해결 방법이 나와 있습니다.import_array
my_importer
declare -a tmp1 tmp2
for (( i=1; i<=10; i++ ))
do tmp1[$i]=x$i
tmp2[$i]=y$i
done
import_array(){
local func=$1; shift;
export $func='() {
'"$(for arr in $@; do
declare -p $arr|sed '1s/declare -./&g/'
done)"'
}'
}
import_array my_importer tmp1 tmp2
옵션을 사용하여 명령 환경에 함수를 전달한 parallel
다음 실행하기 전에 함수를 실행하면 됩니다 .my_importer
pf
--env my_importer
pf
pf(){ a=$1; b=$2; echo "job a=$a b=$b"; }
export -f pf
parallel -v --jobs 5 --linebuffer \
--env my_importer 'my_importer;' pf '${tmp1[{#}]}' '${tmp2[{#}]}' ::: $(seq 10)
결과 출력은 -v
다음과 비슷합니다.
my_importer; pf ${tmp1[2]} ${tmp2[2]}
my_importer; pf ${tmp1[1]} ${tmp2[1]}
my_importer; pf ${tmp1[5]} ${tmp2[5]}
my_importer; pf ${tmp1[3]} ${tmp2[3]}
job a=x1 b=y1
my_importer; pf ${tmp1[6]} ${tmp2[6]}
job a=x2 b=y2
my_importer; pf ${tmp1[7]} ${tmp2[7]}
job a=x4 b=y4
...