sem을 사용하여 for 루프에서 쉘 명령을 병렬로 실행하는 방법은 무엇입니까?

sem을 사용하여 for 루프에서 쉘 명령을 병렬로 실행하는 방법은 무엇입니까?

이것은 나에게 아무것도 속도를 높이지 않습니다.

domains=()

for i in `seq 1 100`; do
    echo $i
    word=`sem "xidel -s 'https://www.thisworddoesnotexist.com/' -e '//div[@id="definition-word"]/text()'"`
    len=${#word}
    if [ "$len" -lt "8" ]; then
        word=`echo $word | sed 's/[^a-z A-Z]//g'`
        domains+=(${word}.com)
    fi
done
sem --wait

printf '%s\n' "${domains[@]}"

for 루프 본문을 병렬로 실행하려고 합니다 sem.

답변1

당신이 찾고있는 parset:

myfunc() {
    word=$(xidel -s 'https://www.thisworddoesnotexist.com/' -e '//div[@id="definition-word"]/text()')
    len=${#word}
    if [ "$len" -lt "8" ]; then
        word=`echo $word | sed 's/[^a-z A-Z]//g'`
        echo ${word}.com
    fi
}
export -f myfunc

parset domains -j 30 myfunc ::: {1..100}
printf '%s\n' "${domains[@]}"

parsetGNU Parallel의 일부입니다.

답변2

sem적절한 매개변수를 지정하여 병렬로 실행하려는 작업 수를 알려야 합니다.- 일하다플래그, 기본값은 1입니다.

--jobs N
-j N
--max-procs N
-P N
    Run up to N commands in parallel. Default is 1 thus acting like a mutex.

그러나 sem의 데이터는 반환되지 않습니다 xidel. 가장 쉬운 방법은 루프 본문을 자체 스크립트로 추출하고 출력을 파일에 쓴 다음 실행하는 것입니다.

domains=()

for i in $(seq 1 100); do
    echo $i
    sem --jobs=<N> script.sh "$i"
done
sem --wait
cat <some directory>/script_output_*

귀하의 요청이 허용되는 경우.

관련 정보