bash - 在 BASH 中以 N 进程批处理并行运行

标签 bash parallel-processing wait sleep

我有一个 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 件事,称为 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}

关于bash - 在 BASH 中以 N 进程批处理并行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41988446/

相关文章:

php - Bash 和 PHP - 在一定时间后调用函数/命令

C# 并行库、XmlReader、XmlWriter

parallel-processing - 与 Cython 内存 View 并行化

java - 等待和通知的代码执行顺序

java - 如何杀死等待中的正在运行的线程?

bash - 函数位置

linux - Bash:在模式之后将一个文件的内容插入到另一个文件中

linux find命令不必要的数据

java - Java 中并行流的实用用例有哪些?

Java多线程服务器notify() IllegalMonitorStateException