shell中並沒有真正意義的多執行緒,要實現多執行緒可以啟動多個後端程序,最大程度利用cpu效能。
直接看**示例吧。
(1) 順序執行的**
1 #!/bin/bash2date
3for i in `seq15
`4do5
9done
10date
輸出:
sat nov 1909:21:51 cst 2016
sleep
5sleep
5sleep
5sleep
5sleep
5sat nov
1909:22:16 cst 2016
(2) 並行**
使用'&'+wait 實現「多程序」實現
1 #!/bin/bash2date
3for i in `seq15
`4do5&
9done
10wait##等待所有子後台程序結束
11date
輸出:
sat nov 1909:25:07 cst 2016
sleep
5sleep
5sleep
5sleep
5sleep
5sat nov
1909:25:12 cst 2016
(3) 對於大量處理任務如何實現啟動後台程序的數量可控?
簡單的方法可以使用2層for/while迴圈實現,每次wait內層迴圈的多個後台程式執行完成。
但是這種方式的問題是,如果內層迴圈有「慢節點」可能導致整個任務的執行執行時間長。
更高階的實現可以看(4)
(4) 使用命名管道(fifo)實現每次啟動後台程序數量可控。
1 #!/bin/bash23function
my_cmd()
910 tmp_fifofile="
/tmp/$$.fifo"11
mkfifo
$tmp_fifofile # 新建乙個fifo型別的檔案
12 exec 6
<>$tmp_fifofile # 將fd6指向fifo型別
13rm
$tmp_fifofile #刪也可以
1415 thread_num=5
# 最大可同時執行執行緒數量
16 job_num=100
# 任務總數
1718
#根據執行緒總數量設定令牌個數
19for ((i=0;i<$;i++));do
20echo
21done >&6
2223
for ((i=0;i<$;i++));do
# 任務數量
24 # 乙個read -u6命令執行一次,就從fd6中減去乙個回車符,然後向下執行,
25# fd6中沒有回車符的時候,就停在這了,從而實現了執行緒數量控制
26 read -u6
2728
#可以把具體的需要執行的命令封裝成乙個函式
29 &
3233
echo >&6 # 當程序結束以後,再向fd6中加上乙個回車符,即補上了read -u6減去的那個
34done
3536
wait
37 exec 6>&-# 關閉fd6
38echo
"over
"
參考:
linux shell程式設計多執行緒和wait命令學習
最近在使用shell做一些部署工作,在使用過程中,效率一直不高。想提高效率,經過分析發現,並不是所有操作都是需要序列的,一些操作是可以進行並行操作的。經過學習,shell裡面也是可以進行多執行緒程式設計的,而且十分方便,同時,wait命令可以進行shell的多執行緒同步控制。下面是shell多執行緒...
linux shell程式設計多執行緒和wait命令學習
最近在使用shell做一些部署工作,在使用過程中,效率一直不高。想提高效率,經過分析發現,並不是所有操作都是需要序列的,一些操作是可以進行並行操作的。經過學習,shell裡面也是可以進行多執行緒程式設計的,而且十分方便,同時,wait命令可以進行shell的多執行緒同步控制。下面是shell多執行緒...
linux shell程式設計多執行緒和wait命令學習
最近在使用shell做一些部署工作,在使用過程中,效率一直不高。想提高效率,經過分析發現,並不是所有操作都是需要序列的,一些操作是可以進行並行操作的。經過學習,shell裡面也是可以進行多執行緒程式設計的,而且十分方便,同時,wait命令可以進行shell的多執行緒同步控制。下面是shell多執行緒...