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 秒"

你可能感兴趣的:(脚本,linux,bash,linux)