2.16 利用并行进程加速命令执行

在过去的几年中,计算能力有了大幅度的攀升。但这并不是仅仅因为处理器有了更高的时钟频率,而是因为多核的出现。对于用户而言,这意味着单个物理处理器中包含了多个逻辑处理器。

除非软件能够善加利用多核,否则它们毫无用武之地。如果你有一个需要进行大量运算的程序,仅运行在其中一个核心上,那么其他的核心都会被闲置。如果想提高速度,软件必须留意并充分利用多核。

在这则攻略中,我们会看到如何让命令运行得更快。

2.16.1 实战演练

以之前讲过的md5sum命令为例。由于涉及运算,该命令属于CPU密集型命令。如果多个文件需要生成校验和,我们可以使用下面的脚本来运行md5sum的多个实例。

#/bin/bash
#文件名: generate_checksums.sh
PIDARRAY=()
for file in File1.iso File2.iso
do
  md5sum $file &
  PIDARRAY+=("$!")
done
wait ${PIDARRAY[@]}

运行脚本后,可以得到如下输出:

$ ./generate_checksums.sh
330dcb53f253acdf76431cecca0fefe7  File1.iso
bd1694a6fe6df12c3b8141dcffaf06e6  File2.iso

输出结果和下面命令的结果一样:

md5sum File1.iso File2.iso

但是因为多个md5sum命令是同时运行的,如果你使用的是多核处理器,就会更快地获得运行结果(可以使用time命令来验证)。

2.16.2 工作原理

我们利用了Bash的操作符&,它使得shell将命令置于后台并继续执行脚本。这意味着一旦循环结束,脚本就会退出,而md5sum命令仍在后台运行。为了避免这种情况,我们使用$!来获得进程的PID,在Bash中,$!保存着最近一个后台进程的PID。我们将这些PID放入数组,然后使用wait命令等待这些进程结束。