深度分析

shell并发,并行

2020-03-19  本文已影响0人  小潤澤

简介

首先明确,程序在执行的时候是串行执行的,那么在程序执行中往往可以利用并发和并行来优化

那么并发和并行的区别是什么?
并行抓住一个关键词,那就是多个程序是否同时执行
并发并不一定是要同时执行,所以并行是并发的一个子集,并发强调的是系统具有处理多个任务的能力,但不一定要同时;并行也是用于描述统具有处理多个任务的能力,但一定是同时运行

并行

那么我们看下用shell怎么来写并行,这里只介绍一种方法

 #!/bin/bash
 for i in (recurrency)
  do
 {
       express
 } &
done
wait  ##等待所有子后台进程结束

典型的是大括号加&,wait则是等待所有子程序结束

我们看下串行和并行的区别

#!/bin/bash
date
for i in `seq 1 5`
do
 {
     echo "sleep 5"
     sleep 5
 }
done
date

再来看看并行处理

 #!/bin/bash
date
for i in `seq 1 5`
do
 {
     echo "sleep 5"
     sleep 5
 } &
done
wait  ##等待所有子后台进程结束
date

关于输出5个数,我们可以对比下时间,显然并行速度更快

并发

关于并发,我们用建立文件夹为例子
无并发

#!/bin/bash

#开始时间
begin=$(date +%s)

#测试根目录
root_dir="/home/tes1"

if [ ! -d $root_dir ]; then
        mkdir -p $root_dir
fi
cd $root_dir


#循环创建10000个目录
for ((i=0; i<10000; ))
do
        mkdir $i
        i=$(expr $i + 1)
done

#结束时间
end=$(date +%s)
spend=$(expr $end - $begin)
echo "花费时间为$spend秒"

循环建立10000个文件夹,处理时间为


所用时间
结果

现在用并发来看看

#!/bin/bash

#开始时间
begin=$(date +%s)

#测试根目录
root_dir="/home/tes2"

if [ ! -d $root_dir ]; then
        mkdir -p $root_dir
fi
cd $root_dir

#批量创建目录函数
function create_dir()
{

        mkdir $1
}

#循环创建10000个目录
count=10000
rsnum=200
cishu=$(expr $count / $rsnum)

for ((i=0; i<$cishu;))
do
        start_num=$(expr $i \* $rsnum + $i)
        end_num=$(expr $start_num + $rsnum)
        for j in `seq $start_num $end_num`
        do
                create_dir $j &
        done
        wait
        i=$(expr $i + 1)
done

#结束时间
end=$(date +%s)
spend=$(expr $end - $begin)
echo "花费时间为$spend秒"

所用时间

做并发有什么特征呢?比方说我们要建立文件夹,那么就先写一个建立文件夹的函数
以这个例子来看,我们要建立10000个文件夹,那么我们200个为一组,注意那个嵌套循环体:
第一个循环,是200个一组,里面的循环是以200个为一个基数,建立文件夹
我们不妨把start_num输出一下:


添加代码输出

再有就是第二层循环的&,相当于并发建立文件夹(一起建立)wait等待子程序完成,这样速度快一些

参考:https://blog.csdn.net/wzy_1988/article/details/8811153

上一篇下一篇

猜你喜欢

热点阅读