一直在找一个bash实现的多线程,虽然这个方法看着不怎么高明,但是比那个fifo的写法,看着明白点。这里面也限制了最多线程数,类似于线程池,记录在此,以备后用。

#!/bin/bash

MAX_THREAD_NUM=10;
thread_pids=()

#执行线程
function hello_thread(){
    echo "print $1"
    sleep 5;
}

#检查是否有完成的线程,把pid剔除调
function check_current_thread(){
    if [ ${#thread_pids[@]} -ne 0 ]; then
        for pid_idx in ${!thread_pids[*]}; do
           pid_val=${thread_pids[$pid_idx]}
           kill -s 0 $pid_val &>/dev/null || unset thread_pids[$pid_idx]
        done
        thread_pids=("${thread_pids[@]}")
    fi;
}

for i in {1..100}; do
#如果当前执行的线程数少于10个,就加一个任务
    if [ ${#thread_pids[@]} -lt $MAX_THREAD_NUM ]; then
        hello_thread $i &
        thread_pids=("${thread_pids[@]}" "$!");
    else
        sleep 1;
        check_current_thread;
    fi
done
#等待最后的任务结束
while [ ${#thread_pids[@]} -ne 0 ]; do
    check_current_thread;
    sleep 1;
done;