Linux Shell 多线程数量控制 时间: 2020-04-19 12:47 分类: Shell,Linux ####前言 通常,为了提高任务执行效率,我们需要用到多线程去处理任务,在`Linux`中,我们都知道:在命令的后面添加`&`符号即可开启后台运行,也就相当于一个线程。 但是,如果不加以控制,任务又是比较耗时的操作,那么最终将会耗尽系统资源,也就无法达到我们预期的效果。 所以我们需要对线程数加以控制。 ####实现 在`Shell`脚本中,我们是通过管道来实现线程数量控制的,首先我们需要来定义一个管道(不要用系统已有的管道): ```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 ``` 标签: 无