您的位置:首页 > 运维架构 > Shell

Shell多线程脚本

2016-06-15 14:08 309 查看
<--目录-->
1)多线程概述
2)多线程脚本内容
3)多线程脚本执行时间
4)单线程脚本内容
5)单线程脚本执行时间

【多线程概述】
# 多线程指并发执行任务,而不是一台一台的串行来执行任务,这样可以更快且更高效的利用资源
# 我们来描述一下怎么准确控制并发数目
# 下面例子说明了一种用wait、read命令模拟多线程的一种技术技巧
# 此技巧往往用于多主机检查,比如ssh登陆、ping等等这种单进程比较慢而不耗费CPU的情况
# 还说明了多线程的控制

【多线程脚本内容】
#!/bin/bash
function a_sub { # 此处定义一个函数,作为一个线程(子进程)
sleep 3 # 线程的作用是睡眠3秒
}
tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile # 新建一个fifo类型的文件
exec 6<>$tmp_fifofile # 将fd6指向fifo类型
rm $tmp_fifofile
thread=5 # 此处定义线程数,我给他定义了五个线程,一会就是五个并发执行
for ((i=0;i<$thread;i++));do
echo
done >&6 # 事实上就是在fd6中放置了$thread个回车符
for ((i=0;i<20;i++));do # 20次循环,可以理解为20个主机,或其他
read -u6
# 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
{ # 此处子进程开始执行,被放到后台
a_sub && { # 此处可以用来判断子进程的逻辑
echo "Hellow World"
} || {
echo "Hellow error"
}
echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
} &
done
wait
exec 6>&- # 关闭df6
exit 0

【多线程脚本执行时间】[root@localhost opt]# time sh a.sh
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World

real 0m12.015s
user 0m0.002s
sys 0m0.017s

分析:
sleep 3s,线程数为5,一共循环20次,所以,此脚本一共的执行时间大约为12秒所以一次执行五个线程,即五个主机一起执行,一共执行四次  即:  5×4=20, 五台主机一共循环四次 所以 4 x 3s = 12s 一次循环所用三秒时间
【单线程脚本内容】[root@localhost opt]# cat b.sh
#!/bin/bash
for((i=0;i<20;i++))
do
echo "Helloworld!!!"
sleep 3
done

【单线程脚本执行时间】[root@localhost opt]# time sh b.sh
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!
Helloworld!!!

real 1m0.041s
user 0m0.008s
sys 0m0.023s

结论:
多线程执行任务完成时间 12s
单线程执行任务完成时间 60s
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  脚本 shell 多线程