在shell中可以通过使用【{需要并行执行的部分}$】这样的模式实现对某一段脚本进行并行处理。
下面先来看一下一个单线程的程序。
#!/bin/bash
cat test.txt | while line
do
echo "${line}"
sleep 5
done
上面这个程序会从test.txt文件中读取内容,通过管道的方式逐一将每行的内容传给line,每一次循环都会先打印每一行的内容,然后休眠5秒。执行的输出如下所示。
如果使用文首的结构,循环内部被包起来的代码会被移到后台运行,这样就不用等待前面的代码,而可以直接执行后面的代码,代码如下图所示。
#!/bin/bash
cat test.txt | while line
do
{
echo "${line}"
sleep 5
} &
done
执行处理的效果如下图所示。
不过这样的话,是存在缺陷的,有可能父进程已经执行完毕了,但是子进程还在执行,而且子进程执行结束的顺序也不一定是开始执行的顺序(图中并没有体现出来),如果需要父进程等待子进程结束之后在执行可以使用wait命令,代码如下图所示。
#!/bin/bash
cat test.txt | while line
do
{
echo "${line}"
sleep 5
} &
done
wait
echo "Finished"
这样的话父进程就会等待子进程执行完毕后再执行wait后面的内容。