Shell 多线程

posts/shell%E5%A4%9A%E7%BA%BF%E7%A8%8B

For 语句实现多线程

实例代码

#!/bin/bash

thread_num=10   # 设置线程数

for ((i=1;i<=$thread_num;i++))
do
        sleep 1 # 模拟实际命令
        echo 'Thread '$i' executed successfully.'
done

缺点

无法并发,效率低。

使用 ‘&’+wait 实现多线程

示例代码

#!/bin/bash

thread_num=10   # 设置线程数

for ((i=1;i<=$thread_num;i++))
do
{
        sleep 1 # 模拟实际命令
        echo 'Thread '$i' executed successfully.'
}&
done
wait     # 等待所有线程结束

缺点

对线程并发数不可控,如果处理很多文件系统会随着高并发压力的不断攀升,处理速度变得越来越慢。

使用 FIFO 实现多线程

#!/bin/bash

thread_num=5    # 设置线程数

tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile   # 新建一个FIFO类型的文件
exec 6<>$tmp_fifofile  # 将FD6指向FIFO类型
rm $tmp_fifofile  # 删除文件

# 根据线程总数量设置令牌个数
# 事实上就是在fd6中放置了$thread_num个回车符
for ((i=0;i<${thread_num};i++));do
    echo
done >&6

do
    # 一个read -u6命令执行一次,就从FD6中减去一个回车符,然后向下执行
    # 当FD6中没有回车符时,就停止,从而实现线程数量控制
    read -u6
    {
        sleep 1 # 模拟实际命令
        echo >&6 # 当进程结束以后,再向FD6中加上一个回车符,即补上了read -u6减去的那个
    } &
done
wait    # 等待所有线程结束
exec 6>&- # 关闭FD6

参考链接