欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

shell子進程多任務(wù)實現(xiàn)進程高并發(fā)

 更新時間:2023年07月31日 10:37:34   作者:〖羊頭〗? lsy  
本文主要介紹了shell子進程多任務(wù)實現(xiàn)進程高并發(fā),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

多進程的作用

提高程序的效率:一些CPU密集型的任務(wù),如數(shù)據(jù)處理、解壓、加密等,使用多進程可以提高程序的執(zhí)行效率,更快地完成計算任務(wù);

實現(xiàn)更復(fù)雜的功能:多進程可以在同一時間向不同的方向處理不同的任務(wù),可以利用這一特性實現(xiàn)更加復(fù)雜的功能。

1. 了解實現(xiàn)多進程的方法

Linux 通過后臺執(zhí)行,語法如下:

command &
nohup command &

兩種方式都可以實現(xiàn)后臺運行,但也存在區(qū)別。

1. 通過命令執(zhí)行

command &:輸出的結(jié)果顯示到終端窗口,會隨著終端窗口退出而退出(不建議)

nohup command &:自動將結(jié)果輸出到 nohup.out 文件(即使異常提示)。這種方式不論是終端退出還是ssh斷開,都不會影響后臺進程運行

如果后臺進程繼續(xù)運行,可以通過 jobs 查看

推薦幾個相關(guān)的命令

jobs  #查看后臺運行的任務(wù)列表
bg    #將凍結(jié)的任務(wù)運行到后臺( bg [jobs列表號] ),可以是 Ctrl + Z 停止的進程
fg    #將后臺任務(wù)轉(zhuǎn)到前臺運行( fg [jobs列表號] )

2. 通過 shell 執(zhí)行

兩者的區(qū)別和命令執(zhí)行差不多,如果shell中使用的 command &,但是執(zhí)行shell腳本的是 nohup src.sh & ,那么該子進程同樣不會隨著終端的退出而停止。

不加 nohup

加入 nohup

2. shell 子進程應(yīng)用

直接在命令后面加 & 其實意義不到,可作用的范圍小,一般用于函數(shù)的使用。

定義3個函數(shù),用 & 方法將函數(shù)變換為子進程

proc1(){
echo "我是子進程1..."
sleep 1000
}
proc2(){
echo "我是子進程2..."
sleep 1000
}
proc3(){
echo "我是子進程3..."
sleep 1000
}
proc1 &
proc2 &
proc3 &
wait
echo "======== 結(jié)束 ========"

[函數(shù)名] & :表示子進程

wait:表示必須等待子進程結(jié)束才能執(zhí)行下一步

使用 wait 等待子進程,所以主進程并不會退出。來看一下進程信息

如果不使用 wait,程序會繼續(xù)向下執(zhí)行

proc1(){
echo "我是子進程1..."
sleep 1000
}
proc1 &
echo "======== 當(dāng)前進程情況 ========"
ps xl |grep $$ |grep -v grep

可以看到在沒有等待子進程的情況會直接向下執(zhí)行,直到結(jié)束也不會停止子進程(此時的子進程的父進程已停止,變成了孤兒進程被進程1接收) 

那么如何解決孤兒進程呢?可以通過 trap 命令捕獲異常,子進程隨著主進程的退出而退出

trap "[命令1] ; [命令2] ; [命令3]..." EXIT
sleep 1000 &
cpid1="$!"
sleep 1001 &
cpid2="$!"
trap "kill -9 ${cpid1} ${cpid2} 2>/dev/null; echo '退出信號!'; exit" EXIT
echo "======== 當(dāng)前進程情況 ========"
ps xl |grep $$ |grep -v grep

通過 $! 獲取子進程的PID,再使用 trap 捕獲退出信號時將其殺死

3. shell 高并發(fā)

通過上述的方法了解的子進程實現(xiàn)的原理后,高并發(fā)就非常的簡單(for循環(huán))

proc1(){
for i in {1..10};do
        echo "我是子進程1" &
done
}
proc2(){
for i in {1..10};do
        echo "我是子進程2" &
done
}
proc1
proc2
wait

proc1(){
echo "我是子進程1"
}
proc2(){
echo "我是子進程2"
}
for k in {1..5};do
        proc1 &
        proc2 &
done
wait

 到此這篇關(guān)于shell子進程多任務(wù)實現(xiàn)進程高并發(fā)的文章就介紹到這了,更多相關(guān)shell子進程多任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論