一直在找一个bash实现的多线程,虽然这个方法看着不怎么高明,但是比那个fifo的写法,看着明白点。这里面也限制了最多线程数,类似于线程池,记录在此,以备后用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #!/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; |
除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址
本文地址:https://zhaoyanblog.com/archives/620.html
jobs -l 可以了解一下 可以简化逻辑
补充:专业一点的多线程