bash 脚本中的多线程/分叉

bash 脚本中的多线程/分叉

我编写了一个 bash 脚本,其格式如下:

#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"

rm -f $inFile $outFile

while read line
do

    -- Block of Commands

done < "$inFile"

end=$(date +%s)

runtime=$((end-start))

echo "Program has finished execution in $runtime seconds."

while循环将从 读取$inFile,在线上执行一些活动并将结果转储到 中$outFile

由于$inFile该脚本有 3500 多行,完整执行需要 6-7 个小时。为了最大限度地减少这个时间,我计划在此脚本中使用多线程或分叉。如果我创建 8 个子进程,$inFile则将同时处理8 行。

如何才能做到这一点?

答案1

GNUparallel就是为这类事情而设计的。您可以一次多次运行脚本,并为每个脚本输入来自输入的不同数据:

cat input.txt | parallel --pipe your-script.sh

默认情况下,它将根据系统上的处理器数量生成进程,但您可以使用-j N.

一个特别巧妙的技巧是 shebang-wrapping 功能。如果将 Bash 脚本的第一行更改为:

#!/usr/bin/parallel --shebang-wrap --pipe /bin/bash

并通过标准输入向其提供数据,然后一切都会自动发生。当您有必须在最后运行的清理代码(您可以这样做)时,这不太有用。

有几点需要注意。一是它会将您的输入切分成连续的块并一次使用这些块 - 它不会交错行。另一个是这些块是按大小分割的,而不考虑有多少记录。您可以用来--block N设置不同的块大小(以字节为单位)。就您而言,不超过文件大小的八分之一应该是正确的。您的文件听起来可能足够小,最终会全部放在一个块中,否则就会达不到目的。

对于特定的不同用例有很多选择,但是教程内容涵盖得很好。您可能还感兴趣的选项包括--round-robin--group

相关内容