1. 程式人生 > >002-Shell的並發執行原理及其實現

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

控制 def ron man 限制 .sh bash 過多 及其

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

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