어떻게 셸 로 기본 적 인 스 레 드 풀 을 실현 합 니까?

본 고 는 주로 bash 를 어떻게 이용 하여 기본 적 인 스 레 드 탱크 를 실현 하 는 지 를 소개 했다.
1. 예비 지식
  • {}&   Liux 에서 전체 코드 블록 을 배경 에 넣 고 실행 하 는 것 을 표시 합 니 다
  • wait  wait 명령 은 모든 백 엔 드 프로 세 스 가 실 행 될 때 까지 기 다 립 니 다
  • FIFO 파이프 파일
  • 2. 사고의 실현
    프로 세 스 풀 을 실현 하 는 데 는 여러 가지 방법 이 있 습 니 다. 예 를 들 어 파일 을 만들어 서 파일 의 개 수 를 판단 하 는 등 입 니 다.본 고 는 fifo 파일 을 이용 하여 스 레 드 탱크 를 실현 하 는 동시에 Liux 에서 read 명령 의 천연 적 인 차단 을 이용 하여 신속하게 실현 했다.
    3. 구체 적 실현
    창설 processpool. sh, 구체 적 인 스 크 립 트 는 다음 과 같 습 니 다.
    #!/bin/bash
     
    #线程池
    process_pool(){
        #判断输入参数等
        if [ $# -lt 3 ]; then
            echo "$0 process_num command [args]"
            return 1
        fi
        _process_num=$1
        shift
        _func=$1
        shift
        if [[ ! $_process_num =~ ^[0-9]+$ ]]; then
            echo "process_num must be a number"
            return 1
        fi
        if !type $_func >/dev/null 2>&1; then
            echo "comannd must be executable"
            return 1
        fi
     
        # 创建一个先进先出的管道文件
        fifo="/tmp/$$.fifo"
        mkfifo $fifo
        #创建一个文件描述符号,把FD这个文件描述符关联到这个文件
        #{FD}表示非显示的描述符
        exec {FD}<>$fifo
        rm $fifo
      
     
        # 创建槽位
        for i in $(seq $_process_num); do
            echo >&$FD
        done
      
     
        # 执行具体命令
        for arg in $@; do
            read -u $FD
            {
                $_func $arg 
                echo >&$FD
            }&
        done
     
        # wait等待所有后台进程执行完成
        wait
     
        # 释放文件描述符
        exec {FD}>&-
    }
     
     
    #以下为测试
    test(){
        echo $1
        sleep 3
        return 0
    }
     
    process_pool 3 'test' 1 2 3 4 5 6 7

    이미 마지막 에 기본 적 인 테스트 용례 가 있 는데, 단지
    sh process_pool.sh

    효 과 를 볼 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기