linuxshell 多线程运行-脚本执行率优化篇
Posted 云来云去-起飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linuxshell 多线程运行-脚本执行率优化篇相关的知识,希望对你有一定的参考价值。
目录
一、场景
以下代码在执行的时候,整个for循环执行完毕,大概需要10000s的时间,这个时间是相当长的
#!/bin/bash
#
for(( j=0;j<=10000;j++ ))
do
echo "success"$j
sleep 1s
done
二、初步的优化
为了让以上代码段执行效率提高,时间缩短,那么我们需要对代码进行优化,代码如下
#!/bin/bash
#
for(( j=0;j<=10000;j++ ))
do
{
echo "success"$j
sleep 1s
}&
done
wait
此时的代码可能在1s内就能执行完,原因是此时执行的代码自动生成了10000个线程,待所有的线程结束后,才进入主线程。那么问题来了。
1.如果自动生成10000个线程,都交给了计算机本身的cpu进行计算,那么如果计算机相对应的负荷只支持88个怎么办。
2.生成的线程是否及时回收关闭。
3.那如何进行对线程数进行控制。
三、线程数控制优化方案
#!/bin/bash
#
#fd2有名管道文件如果不存在便创建
[ -e file2 ] || mkifio file2
#创建描述符,并赋给有名管道 file2
exec 9<>file2
#此处只需要描述符,至于管道文件是不需要的。
rm -f file2
read -p "请输入的你需要创建的线程数:" threadnum
#一个\\n代表一个线程,为了不让线程阻塞,写入\\n,如果在线程正常运行情况下,可以写为 echo >&9
for(( i=0;i<=$thrednum;i++ )){
echo -ne "\\n" 1>&9
}
for(( j=0;j<=10000;j++ ))
do
#打上9的描述符
read -u 9
{
echo "success"$j
sleep 1s
echo -ne "\\n" 1>&9
}&
done
wait
#关闭描述符的读
exec 9<&-
#关闭描述符的写
exec 9>&-
根据线程控制的方案,我们可以看到,10000个执行效率仅需14秒左右,此处的线程设置为1000,虽然比不上第二种,但是这种方式是可控的。
以上是关于linuxshell 多线程运行-脚本执行率优化篇的主要内容,如果未能解决你的问题,请参考以下文章