002-Shell的併發執行原理及其實現

1、正常執行

如果是多個命令執行的話,默認是串行執行的。如果前面的一個任務沒有執行完成,後面的任務就無法執行,即不可能將指令置於CPU上執行。

sleep 10

後臺執行。Default模式下,shell命令是阻塞執行的,可以通過其後添加&讓這條命令異步執行,如:

sleep 10 &

執行這條命令後,並不會阻塞10秒,而是立即返回。

2、並行執行

注意:這裏的並行執行如果是單核CPU的話,實際上指的是併發執行。併發執行是具備並行執行的前提因素。

如果將這種方法用在while循環中,則可以實現多進程並行處理。例如一下test1.sh文件爲:


#!/bin/bash
while read line
do
{
  command 1
} &
done

command 2

這樣的話command 1就可以並行執行了,其實質是將每條command 1命令作爲後臺進程在執行,這樣主進程就不用等待前面的命令執行完畢之後纔開始執行接下來的命令。通過執行ls -l | test1.sh可以看到併發的進程數量。

但是這樣帶來一個問題: 如果在while循環外面的command 2需要用到循環內部執行得到的結果,那麼像test1.sh的這種寫法就不work了。我們可以對其做簡單修改,達到上述目的,如test2.sh:


#!/bin/bash
while read line
do
{
  command 1
} &
done
wait

command 2

上面的代碼是將所有的command 1在後臺並行執行,等到循環裏面的命令都結束之後才執行接下來的command 2。

3、shell腳本的併發控制

有時爲了避免併發進程數過多,導致機器卡死,需要限制併發的數量。以下代碼實現了該功能:

#!/bin/bash
while read line
do
{
  joblist=($(jobs -p))
  while (( ${#joblist[*]} >= 20 ))
  do
  {
      sleep 1
      joblist=($(jobs -p))
  }
  done
  sleep 10 &
}
done

以上方法通過控制後臺任務數來控制併發進程數目在20個以內。


參考:https://blog.csdn.net/p656456564545/article/details/80681934

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章