使用并发的方式执行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如何实现多线程