我有一个 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'并且代码应该停止吗?
最佳答案
很难理解你想要什么,但我认为你想做 7 件事,称为 a
、b
、c
。 ..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 个:
或者,更简单地说,如果您不介意花 10 秒钟安装 GNU Parallel:
parallel -j4 -k 'echo {}; sleep 2' ::: {a..g}
关于bash - 在 BASH 中以 N 进程批处理并行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41988446/