我有一个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
光标没有回到我的终端后,它会无限期地等待/睡觉。我希望光标回到我的终端而且我也不明白为什么输出' e'我的路径在它前面,不应该输出显示为' a'到了'不断,代码应该停止?
答案 0 :(得分:3)
很难理解你想要什么,但我认为你想做7件事,称为a
,b
,c
... {{1并行,一次不超过4个实例。
如果是这样,你可以试试这个:
g
将echo {a..g} | xargs -P4 -n1 bash -c 'echo "$1"; sleep 2' {}
.. a
发送到g
,然后为每个字母开始一个新的xargs
shell,传递一个字母(bash
)作为-n1
的shell。 {}
shell获取参数(其第一个参数为bash
)并回送它然后在退出前等待2秒 - 这样您就可以看到暂停。
$1
告诉-P4
一次同时运行4个xargs
个实例。
这是一个关于它运行的小视频。第一个使用bash
并以4个为一组运行,第二个序列使用-P4
并一次执行2个:
或者更简单地说,如果您不介意花10秒钟安装 GNU Parallel :
-P2
答案 1 :(得分:0)
如果按下输入玩具可以看到比你正常的外壳。如果要在退出脚本之前等待批处理进程,只需在脚本末尾添加wait