我有一个不平凡的 Bash 脚本,大致采用以下形式:
# Initialization
<generate_data> | while read line; do
# Run tests and filters on line
if [ "$tests_pass" ]; then
echo "$filtered_line"
fi
done | sort <sort_option> | <consume_data>
# Finalization
与过滤器相比,生成器消耗最少的处理资源,当然,在所有过滤数据可用之前排序操作无法开始。因此,过滤器(用 Bash 原生编写的多个循环和条件的级联)是处理瓶颈,运行此循环的单个进程会消耗整个核心。
一个有用的目标是将此逻辑分布在多个子进程中,每个子进程运行单独的过滤器循环,并且每个子进程依次消耗来自生成器的行 block ,并且每个子进程生成连接到排序操作的输出 block 。此类功能可以通过 GNU Parallel 等工具获得,但使用它们需要调用外部命令在管道中运行。
是否有任何方便的工具或功能可以使脚本上的操作可以跨多个进程分布,而不破坏脚本的整体结构?我不知道 Bash 是否有内置功能,但肯定会有用。
最佳答案
The issue with invoking an external command is the lack of code manageability with respect to moving the filter logic into some command that can be called independently.
如果这就是不使用 GNU Parallel 的原因,那么听起来好像您不知道 parallel --embed
。
--embed
的制作正是因为人们需要将 GNU Parallel 与其余代码放在同一个文件中。
[output from parallel --embed]
myfilter() {
while read line; do
# Run tests and filters on line
if [ "$tests_pass" ]; then
echo "$filtered_line"
fi
done
}
export -f myfilter
<generate_data> | parallel --pipe myfilter | sort <sort_option> | <consume_data>
即使未安装 GNU Parallel,生成的脚本也会运行。
关于bash - bash 循环的多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59131986/