简介
首先明确,程序在执行的时候是串行执行的,那么在程序执行中往往可以利用并发和并行来优化
那么并发和并行的区别是什么?
并行抓住一个关键词,那就是多个程序是否同时执行
并发并不一定是要同时执行,所以并行是并发的一个子集,并发强调的是系统具有处理多个任务的能力,但不一定要同时;并行也是用于描述统具有处理多个任务的能力,但一定是同时运行
并行
那么我们看下用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等待子程序完成,这样速度快一些
网友评论