如何在 bash 中并行化 while 循环



我有以下并行运行的while循环。(logProcess是我之前在脚本中定义的函数。

while read LINE; do
    logProcess $LINE &
done <<< "$ELS_LOGS"
wait

我需要找到一种方法来限制正在运行的进程数。我知道有并行进程正在运行。如何将循环转换为使用该命令?

我可以向你推荐GNU Parallel。您的整个脚本将变为:

parallel -a "$ELS_LOGS" logProcess

如果logProcess是脚本中定义的函数,则需要在运行 GNU Parallel 之前先将其导出,如下所示:

export -f logProcess

然后,如果你想一次运行 8 个,你只需执行以下操作:

parallel -j 8 -a "$ELS_LOGS" logProcess

如果你想看看它会做什么,而不实际做任何事情:

parallel --dry-run ...

如果需要进度条或预计到达时间:

parallel --eta ...
parallel --bar ...

GNU xargs 也是一个合适的工具:

xargs -P 20 -d $'n' -n 1 logProcess

。将运行多达 20 个并发 logProcess 实例,其中 stdin 的每一行都提供给xargs传递给不同的此类实例。

最新更新