이것은 나에게 아무것도 속도를 높이지 않습니다.
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[@]}"
parset
GNU 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_*
귀하의 요청이 허용되는 경우.