shell 多线程

1. 线程数量不可控

#!/usr/bin/bash

function  do_work() {
    echo "线程 $1 运行中..."
    sleep 1m
}

echo "线程数量不可控演示..."
for i in {1..100}; do {
    do_work $i
}&
done; wait  #等待结束
echo "用时 $SECONDS 秒"

2. 线程数量可控

方案1:(管道FIFO+文件描述符)

#!/usr/bin/bash

function  do_work() {
    echo "线程 $1 运行中..."
    sleep 3s
}

# 1. #以‘>读写<’方式指向新建的管道fifo,新建好后可以删除
f="/tmp/$$.fifo" # $$表示进程号
mkfifo $f; exec 5<>$f; rm $f

# 2.可控的干活    in > [====fifo====] >out
thread=5; jobs=20   # 线程数,任务数
echo "数量可控的多线程运行, 每次${thread}个线程..."
for i in $(seq 1 1 $thread); do echo >&5; done  #随便echo个字符在fd中
for i in $(seq 1 1 $jobs);   do
    read -u5 #每次从fd中减去一个字符
    {
        do_work $i
        echo >&5  #随便echo个字符在fd中
    }&
done; wait

exec 5>&-  #关闭fd读
exec 5<&-  #关闭fd写

echo "用时 $SECONDS 秒"

方案2:根据进程实时目录: /proc/pid

#!/usr/bin/bash

function  do_work() {
    echo "线程 $1 运行中..."
    sleep 3s
}

function check_done {
    old=$que; que=""; n=0
    for pid in $old; do
        [[ ! -d /proc/$pid ]] && continue
        ((n++)); que+="$pid "
    done
}

thread=5; jobs=20 # 线程数,任务数
echo "数量可控的多线程运行, 每次${thread}个线程..."
for i in $(seq 1 1 $jobs); do
    do_work $i&
    que+="$! " #PID
    ((n++))
    while [[ $n -ge $thread ]]; do
        check_done
    done
done
wait

echo "用时 $SECONDS 秒"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值