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 多线程运行-脚本执行率优化篇的主要内容,如果未能解决你的问题,请参考以下文章

Java基础-多线程篇

Python学习笔记——进阶篇第八周———CPU运行原理与多线程

并发编程之多线程基础篇及面试

多线程编程 实战篇

shell编程-项目部署(优化篇)

多线程上下文切换优化与注意