【Shell-多并发】使用Shell脚本在循环中进行多并发的操作
1)方式一 (利用 for 循环)
1.1.案例一(缺少 wait 导致执行顺序有误)
> for i in `seq 1 10`
do
sleep 1 &; echo $i
done
echo "all weakup"
这个例子要求在 for 循环中的所有命令(sleep 1)都执行完之后,打印 “all weakup”。如果按照这段脚本,发现情况并不是这样的,因为 for 循环不会等待 sleep 命令执行结束后才结束,而是把命令提交给系统后自己就退出了,进而还没有1个 sleep 执行完毕之前,“all weakup” 就已经打印了。
1.2.案例二(缺少控制阻塞导致任务全部执行)
为了达到题目要求,需要在 echo “all weakup” 命令之前,加上 wait命令,意为等待上面所有 & 作用过的后台任务执行结束后才继续往下。
> for i in `seq 1 10`
do
sleep 1 &; echo $i
done
wait
echo "all weakup"
1.3.案例三(最终版)
上面的示例中,for 循环会将所有命令转为后台执行。显然,如果每个命令需要比较大的开销,并且循环次数太多,这个方法并不可取。那么,要求 for 循环有部分执行或循环达到一定次数后就要 wait,等待前一批次的所提交的任务执行完之后,再提交一定数量命令(再循环一定次数)后再继续 wait。虽然这种方案并不优雅,但至少不会导致一次性向系统提交过多后台任务。
degree=4
for i in `seq 1 10`
do
sleep 1 & # 提交到后台的任务
echo $i
[ `expr $i % $degree` -eq 0 ]