比较容易理解的bash多线程实现方式

一直在找一个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;
  1. totola147说道:

    jobs -l 可以了解一下 可以简化逻辑

  2. 大岩不灿说道:

    补充:专业一点的多线程

    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
    
    #!/bin/bash
     
    tmp_fifofile=" /tmp/$$.fifo "
    mkfifo  $tmp_fifofile
    exec 6<>$tmp_fifofile
    rm  $tmp_fifofile
     
    #线程个数
    thread=2
    for  (( i=0 ;i < $thread ;i++ )); do
    echo
    done  >&6
     
    //你的任务队列
    for ((i=0;i<100; i++))
    read  -u6
    {
       //todo 你的逻辑任务
       echo  >&6
    }&
     
    done
     
    wait
    exec  6>&-
     
    exit  0

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 *