셸 대기 열 제어 병행 스 크 립 트 구현

업무 중 에 개인 은 통계 데이터 의 스 크 립 트 를 사용 해 야 한다. 예 를 들 어 대량 파일 필터 키 워드 를 통계 하 는 등 이런 수 요 는 흔히 볼 수 있다.기본 셸 스 크 립 트 는 직렬 입 니 다. 많은 파일 이 있 을 때 반복 적 으로 걸 러 내야 합 니 다. 이 과정 은 오래 걸 리 고 효율 도 낮 습 니 다.자 료 를 찾 아 스 크 립 트 를 조정 하고 동시 실행 을 실현 합 니 다. 구체 적 으로 다음 과 같 습 니 다.
#!/bin/bash
date

DIR=/test/log/

FILE_NAME=65535_`date +"%Y%m%d"`;
FILE_NAME_LAST_DAY=`date -d "yesterday" +"%Y%m%d"`;

time_of_system=`date +"%Y-%m-%d"`

function multi_processor(){
    [ -e /tmp/fd1 ] || mkfifo /tmp/fd1    #创建有名管道
    exec 3<>/tmp/fd1    #创建文件描述符,以可读()的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性       
    rm -rf /tmp/fd1    #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了
    for ((i=1;i<=30;i++))    #30这个具体可以根据系统的cpu核数来调整
    do
        echo >&3     #&3代表引用文件描述符3,这条命令代表往管道里面放入了一个"令牌"
    done

    for file in $1
    do
    read -u3    #代表从管道中读取一个令牌
    {
        grep $3 $file | awk -F"|" '{print $7}' | sort | uniq >> $2;    #具体的批量过滤逻辑
        echo >&3    #代表我这一次命令执行到最后,把令牌放回管道
    }&
    done
    wait

    exec 3#关闭文件描述符的读
    exec 3>&-    #关闭文件描述符的写
}

#register 1 day ago
register_file=register_file_1_day_ago_$HOSTNAME.txt
file_modify_time=`stat $register_file | grep Modify | awk '{print $2}'`
files_last_day=`find $DIR -type f -name "$FILE_NAME_LAST_DAY*"`
if [[ $file_modify_time != $time_of_system ]]; then
    echo "$register_file file_modify_time(${file_modify_time}) time_of_system(${time_of_system})"
    rm $register_file
    multi_processor "$files_last_day" "$register_file" "REGISTER"
fi

코드 분석 및 문제:
1. 파 이 프 는 하 나 를 저장 하고 하 나 를 읽 으 면 하나 가 줄 어 들 고, 없 으 면 막 히 고, 다시 놓 는 것 은 반복 해서 찾 을 수 있 는 대기 열 특성 이 있 습 니 다. 그러나 문 제 는 파이프 파일 에 내용 을 넣 으 면 아무 도 찾 지 않 으 면 막 힌 다 는 것 입 니 다. 그러면 영원히 파이프 에 10 개의 내용 을 동시에 넣 을 수 없습니다 (10 개의 약숟가락 이 되 고 싶 습 니 다).이 문 제 를 해결 하 는 관건 은 바로 파일 설명자 이다.
2. mkfifo/tmp/fd1 유명 파이프 파일 exec 3 < >/tmp/fd1 을 만 들 고 파일 설명자 3 관련 파이프 파일 을 만 듭 니 다. 이때 3 이 파일 설명 자 는 파이프 의 모든 특성 을 가지 고 있 으 며 파이프 가 없 는 특성 도 가지 고 있 습 니 다.인용 파일 설명 자 를 쓸 내용 이 있 는 지 에 대해 서도 신경 쓰 지 마 세 요: & 3 n 회 echo > & 3 을 파이프 에 n 열 쇠 를 넣 을 수 있 습 니 다.
3. 두 개의 for 순환, 첫 번 째 for 순환 10 회, 여자 공중 화장실 입구 에 열 쇠 를 10 개 놓 은 것 과 같 습 니 다. 두 번 째 for 순환 1000 회, 1000 명 이 화장실 에 오 는 것 과 같 습 니 다. read - u3 는 약 숟가락 을 가 져 가 는 것 과 같 습 니 다. {} 안의 마지막 줄 코드 echo > & 3 은 화장실 에 가서 약 숟가락 을 돌려 주 는 것 과 같 습 니 다.
4. 이렇게 해서 10 개의 약 숟가락 으로 1000 개의 임 무 를 제어 하 는 운행 을 실현 했다. 운행 시간 은 101 s 로 방안 2 보다 빠 르 지 않 을 것 이다. 그러나 방안 1 보다 훨씬 빠르다. 이것 은 바로 대열 이 같은 시간 에 최대 10 개의 스 레 드 만 병행 하 는 것 이다. 효율 을 높 일 뿐만 아니 라 병 발 통 제 를 실현 했다.
5. 파일 설명자 exec 3 < >/tmp/fd1 을 만 들 때 빈 칸 이 있어 서 는 안 됩 니 다. 파일 설명자 3 은 읽 기 () 권한 이 있 습 니 다. 열 때 같이 쓸 수 있 습 니 다. 닫 을 때 스위치 를 나 누 어야 합 니 다. exec 3 & - 닫 기 쓰기.
다음으로 이동:https://www.cnblogs.com/chenjiahe/p/6268853.html

좋은 웹페이지 즐겨찾기