admin

Linux Shell 多线程数量控制
前言通常,为了提高任务执行效率,我们需要用到多线程去处理任务,在Linux中,我们都知道:在命令的后面添加&...
扫描右侧二维码阅读全文
19
2020/04

Linux Shell 多线程数量控制

前言

通常,为了提高任务执行效率,我们需要用到多线程去处理任务,在Linux中,我们都知道:在命令的后面添加&符号即可开启后台运行,也就相当于一个线程。
但是,如果不加以控制,任务又是比较耗时的操作,那么最终将会耗尽系统资源,也就无法达到我们预期的效果。
所以我们需要对线程数加以控制。

实现

Shell脚本中,我们是通过管道来实现线程数量控制的,首先我们需要来定义一个管道(不要用系统已有的管道):

#线程数量
THREAD_NUM=32
#定义描述符为9的管道
mkfifo tmp
exec 9<>tmp

由于我们的实现原理是通过管道的读取阻塞来实现的,因此,在初始化自定义管道的时候,我们还需要预先给它写入我们制定线程数量的数据,这里以换行符为例:

for ((i=0;i<$THREAD_NUM;i++))
do
    echo -ne "\n" 1>&9
done

最后在我们需要多线程处理的代码中使用方式如下,这里以下载为例,比如文件中一行一条URL:

while read line
do
    #进程控制,从管道9中读取数据,因为一开始我们写入了32个换行,所以读取完32个换行符之后会开始阻塞,也就达到了我们控制线程数量的效果
    read -u 9
    {
        aria2 "$line"
        #下载任务完成需要向管道写入新的换行符,和JAVA中的阻塞队列差不多,相当于一个通知事件
        echo -ne "\n" 1>&9 
    } &
done < downlist.txt
Last modification:April 19th, 2020 at 12:47 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment