使用并发的方式执行Shell的耗时命令

Published: Tags: SHELL

没有并发,逐个处理,速度很慢

time lsmod |while read P1 P2 P3 ELSE; do 
    Module="$P1"; Size="$P2"; Used="$P3"; #获取参数
    sleep 1; echo $Module $Size $Used; #模拟耗时操作
done

使用XARGS命令(传参需要所有变量)

time lsmod |xargs -I{} -P8 sh -c 'ANONYMOUS_FUNCTION () { 
    Module="$1"; Size="$2"; Used="$3"; #获取{}参数
    sleep 1; echo $Module $Size $Used; #模拟耗时操作
}; ANONYMOUS_FUNCTION {}'

使用管道队列,但是没有XARGS简洁

#!/bin/bash

CONCUR_NUMBER=8 #并发数量

tmpfifo=$(mktemp --dry-run)
mkfifo $tmpfifo; exec 3<>$tmpfifo #创建管道,读写绑定文件标识符「3」
rm     $tmpfifo; unset    tmpfifo #已经绑定文件标识符,可以删除

#换行符即是占位符,其作用类似于令牌
for i in $(seq 1 $CONCUR_NUMBER); do echo >&3; done

#并发耗时操作(以下循环代码,需在脚本运行,否则报错)
while read P1 P2 P3 ELSE; do read -u 3 #获取令牌
{
    Module="$P1"; Size="$P2"; Used="$P3";
    sleep 1; echo $Module $Size $Used;
    echo >&3 #归还令牌
} &
done < <(lsmod)

#等待并发完成,清理文件描述符
wait ; exec 3<&- ; exec 3>&-

以上内容参考互联网及以下资料: SHELL队列实现线程并发控制 情景LINUX-SHELL如何实现多线程