一直在找一个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;