Shell 多线程
posts/shell%E5%A4%9A%E7%BA%BF%E7%A8%8BFor 语句实现多线程
实例代码
#!/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