bash - bash 循环的多处理

标签 bash shell multiprocessing

我有一个不平凡的 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/

相关文章:

regex - 将单词的一部分分配给变量

java - Shell 脚本调用 java 可执行文件并捕获异常

Python 多处理模块

python - 如何关闭/退出从 multiprocessing.Pool 生成的 Selenium Chrome 驱动程序?

mysql - 从 Node js 加载数据 infile 执行缓慢

linux - shell脚本中的su命令

linux - 将环境变量传递给嵌套的 child

perl - 如何将 shell 脚本转换为 Perl 脚本?

linux shell 查找、比较和删除文件

python - Tkinter:通过多处理启动进程创建不需要的新窗口