linux shell 多執行緒執行程式

2021-09-07 07:34:09 字數 1868 閱讀 7448

shell中並沒有真正意義的多執行緒,要實現多執行緒可以啟動多個後端程序,最大程度利用cpu效能。

直接看**示例吧。

(1) 順序執行的**

1 #!/bin/bash

2date

3for i in `seq15

`4do5

9done

10date

輸出:

sat nov 19

09:21:51 cst 2016

sleep

5sleep

5sleep

5sleep

5sleep

5sat nov

1909:22:16 cst 2016

(2) 並行**

使用'&'+wait 實現「多程序」實現

1 #!/bin/bash

2date

3for i in `seq15

`4do5&

9done

10wait##等待所有子後台程序結束

11date

輸出:

sat nov 19

09: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/bash23

function

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多執行緒...