簡介
首先明確薪寓,程序在執(zhí)行的時(shí)候是串行執(zhí)行的亡资,那么在程序執(zhí)行中往往可以利用并發(fā)和并行來優(yōu)化
那么并發(fā)和并行的區(qū)別是什么?
并行抓住一個(gè)關(guān)鍵詞向叉,那就是多個(gè)程序是否同時(shí)執(zhí)行
并發(fā)并不一定是要同時(shí)執(zhí)行锥腻,所以并行是并發(fā)的一個(gè)子集,并發(fā)強(qiáng)調(diào)的是系統(tǒng)具有處理多個(gè)任務(wù)的能力母谎,但不一定要同時(shí)瘦黑;并行也是用于描述統(tǒng)具有處理多個(gè)任務(wù)的能力,但一定是同時(shí)運(yùn)行
并行
那么我們看下用shell怎么來寫并行奇唤,這里只介紹一種方法
#!/bin/bash
for i in (recurrency)
do
{
express
} &
done
wait ##等待所有子后臺(tái)進(jìn)程結(jié)束
典型的是大括號加&幸斥,wait則是等待所有子程序結(jié)束
我們看下串行和并行的區(qū)別
#!/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 ##等待所有子后臺(tái)進(jìn)程結(jié)束
date
關(guān)于輸出5個(gè)數(shù),我們可以對比下時(shí)間咬扇,顯然并行速度更快
并發(fā)
關(guān)于并發(fā)甲葬,我們用建立文件夾為例子
無并發(fā)
#!/bin/bash
#開始時(shí)間
begin=$(date +%s)
#測試根目錄
root_dir="/home/tes1"
if [ ! -d $root_dir ]; then
mkdir -p $root_dir
fi
cd $root_dir
#循環(huán)創(chuàng)建10000個(gè)目錄
for ((i=0; i<10000; ))
do
mkdir $i
i=$(expr $i + 1)
done
#結(jié)束時(shí)間
end=$(date +%s)
spend=$(expr $end - $begin)
echo "花費(fèi)時(shí)間為$spend秒"
循環(huán)建立10000個(gè)文件夾,處理時(shí)間為
現(xiàn)在用并發(fā)來看看
#!/bin/bash
#開始時(shí)間
begin=$(date +%s)
#測試根目錄
root_dir="/home/tes2"
if [ ! -d $root_dir ]; then
mkdir -p $root_dir
fi
cd $root_dir
#批量創(chuàng)建目錄函數(shù)
function create_dir()
{
mkdir $1
}
#循環(huán)創(chuàng)建10000個(gè)目錄
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
#結(jié)束時(shí)間
end=$(date +%s)
spend=$(expr $end - $begin)
echo "花費(fèi)時(shí)間為$spend秒"
做并發(fā)有什么特征呢懈贺?比方說我們要建立文件夾经窖,那么就先寫一個(gè)建立文件夾的函數(shù)
以這個(gè)例子來看,我們要建立10000個(gè)文件夾梭灿,那么我們200個(gè)為一組画侣,注意那個(gè)嵌套循環(huán)體:
第一個(gè)循環(huán),是200個(gè)一組堡妒,里面的循環(huán)是以200個(gè)為一個(gè)基數(shù)配乱,建立文件夾
我們不妨把start_num輸出一下:
再有就是第二層循環(huán)的&,相當(dāng)于并發(fā)建立文件夾(一起建立)wait等待子程序完成,這樣速度快一些