并行运行BASH中的N个过程批次

问题描述 投票:0回答:2

我有一个for循环,我希望一次并行处理它4次。我尝试了https://unix.stackexchange.com/questions/103920/parallelize-a-bash-for-loop页面中的以下代码:

task(){
sleep 0.5; echo "$1";
}
N=4
(
for thing in a b c d e f g; do
   ((i=i%N)); ((i++==0)) && wait
   task "$thing" &
done
)

我已将上述文件存储为test.sh,我得到的输出如下:

path$ ./test.sh
a
b
c
d
path$ e
f
g

并且光标在'g'之后没有回到我的终端,它无限期地等待/休眠。我希望​​光标回到我的终端而且我也不明白为什么输出'e'在我之前有我的路径,不应该输出连续显示为'a'到'g'并且代码应该停止?

bash parallel-processing wait sleep
2个回答
4
投票

很难理解你想要什么,但我认为你想做7件事,称为abc ...... g并行,一次不超过4个实例。

如果是这样,你可以试试这个:

echo {a..g} | xargs -P4 -n1 bash -c 'echo "$1"; sleep 2' {}

这将字母a..g发送到xargs,然后为每个字母开始一个新的bash shell,将一个字母(-n1)传递给shell作为{}bash shell获取参数(它的第一个参数是$1)并回送它然后在退出前等待2秒 - 所以你可以看到暂停。

-P4告诉xargs同时运行4个bash实例。

这是一个运行的小视频。第一个使用-P4并以4个为一组运行,第二个序列使用-P2并且一次执行2个:

enter image description here


或者,更简单地说,如果你不介意花10秒钟安装GNU Parallel:

parallel -j4 -k  'echo {}; sleep 2' ::: {a..g}

0
投票

如果你按回车玩具可以看到比你正常的外壳。如果要在退出脚本之前等待批处理进程,只需在脚本末尾添加wait

© www.soinside.com 2019 - 2024. All rights reserved.