Shell多线程脚本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell多线程脚本相关的知识,希望对你有一定的参考价值。
<--目录-->
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
【多线程脚本执行时间】
[[email protected] 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 一次循环所用三秒时间
【单线程脚本内容】
[[email protected] opt]# cat b.sh
#!/bin/bash
for((i=0;i<20;i++))
do
echo "Helloworld!!!"
sleep 3
done
【单线程脚本执行时间】
[[email protected] 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
本文出自 “wsyht的博客” 博客,请务必保留此出处http://wsyht2015.blog.51cto.com/9014030/1789475
以上是关于Shell多线程脚本的主要内容,如果未能解决你的问题,请参考以下文章