Bash中使用指定線程數完成批量任務

預備知識bash


文件描述符:異步

查看:當前終端的描述符在/dev/fdide

  或echo $$ 查看當前終端進程號,去/proc/進程號/fd中找spa

基本用法線程

exec fd<>file                 #建立一個文件句柄 ,0,1,2爲保留文件句柄不能使用                                   隊列

exec fd>&-   or   exec -fd<&     #關閉文件句柄,從哪一個終端建立要在同一個終端關閉進程


使用指定線程的一個例子:消息隊列

#!/bin/bash
#
WD=192.168.1.
THREAD=30				#要開啓的進程數
TMPFIFO=/root/test/$$.fifo       #臨時管道文件
mkfifo $TMPFIFO 			#建立臨時管道文件
exec 1000<>$TMPFIFO			#建立管道文件管理的文件句柄1000
rm -rf $TMPFIFO		        #刪除臨時管道文件

for ((i=1;i<=$THREAD;i++));do
        echo
done >&1000		#循環寫入回車符到管道,後面借用read命令一次讀取一行的特性,來確保每一行只有一個線程佔位;
                         這裏讓人聯想到生產者&消費者模型,管道文件充當消息隊列,來記錄消費者的需求,而後由生產者
                         去領任務,並完成任務,這裏運用了異步解耦的思想。

for i in `seq 1 255`;do
        read -u1000    #從文件描述符管道中,獲取一個管道的線程佔位而後開始執行操做;read中-u後面跟fd,
                             表示從文件描述符中讀入,該文件描述符能夠是exec新開啓的。
        {
        ping -c 1 -w 1 $WD$i &>/dev/null
        [ $? == 0 ] && echo "$WD$i is up" || echo "$WD$i is down"
        echo "" >&1000  #任務執行完後在fd5中寫入一個佔位符,以保證這個線程執行完後,線程繼續保持佔位,
                             繼而維持管道中永遠是50個線程數,&表示該部分命令/任務放入後臺不佔當前的bash,
                             實現並行處理
        }&
done >> result.txt
wait                #等待父進程的子進程都執行結束後執行後續操做
echo "Hello,world"  
exec 1000>&-        #釋放文件句柄
exit 0
相關文章
相關標籤/搜索