如何使用 sem 在 for 循环中并行运行 shell 命令?

如何使用 sem 在 for 循环中并行运行 shell 命令?

这对我来说并没有加速任何事情:

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通过指定适当的参数来告知要并行运行多少个作业- 工作flag,默认只有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_*

如果您的要求允许的话。

相关内容