shell 实现子进程多任务,进程高并发

多进程的作用

  1. 提高程序的效率:一些CPU密集型的任务,如数据处理、解压、加密等,使用多进程可以提高程序的执行效率,更快地完成计算任务;

  2. 实现更复杂的功能:多进程可以在同一时间向不同的方向处理不同的任务,可以利用这一特性实现更加复杂的功能。

目录

1. 了解实现多进程的方法

2. shell 子进程应用

3. shell 高并发


1. 了解实现多进程的方法

Linux 通过后台执行,语法如下:

command &
nohup command &
  • 两种方式都可以实现后台运行,但也存在区别。

1. 通过命令执行

command &:输出的结果显示到终端窗口,会随着终端窗口退出而退出(不建议)

nohup command &:自动将结果输出到 nohup.out 文件(即使异常提示)。这种方式不论是终端退出还是ssh断开,都不会影响后台进程运行

如果后台进程继续运行,可以通过 jobs 查看

推荐几个相关的命令

jobs  #查看后台运行的任务列表
bg    #将冻结的任务运行到后台( bg [jobs列表号] ),可以是 Ctrl + Z 停止的进程
fg    #将后台任务转到前台运行( fg [jobs列表号] )

  

2. 通过 shell 执行

  • 两者的区别和命令执行差不多,如果shell中使用的 command &,但是执行shell脚本的是 nohup src.sh & ,那么该子进程同样不会随着终端的退出而停止。

不加 nohup

加入 nohup

  

2. shell 子进程应用

直接在命令后面加 & 其实意义不到,可作用的范围小,一般用于函数的使用。

定义3个函数,用 & 方法将函数变换为子进程

proc1(){
echo "我是子进程1..."
sleep 1000
}

proc2(){
echo "我是子进程2..."
sleep 1000
}

proc3(){
echo "我是子进程3..."
sleep 1000
}

proc1 &
proc2 &
proc3 &

wait
echo "======== 结束 ========"
  • [函数名] & :表示子进程
  • wait:表示必须等待子进程结束才能执行下一步

使用 wait 等待子进程,所以主进程并不会退出。来看一下进程信息

 

如果不使用 wait,程序会继续向下执行

proc1(){
echo "我是子进程1..."
sleep 1000
}
proc1 &

echo "======== 当前进程情况 ========"
ps xl |grep $$ |grep -v grep

  • 可以看到在没有等待子进程的情况会直接向下执行,直到结束也不会停止子进程(此时的子进程的父进程已停止,变成了孤儿进程被进程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 "======== 当前进程情况 ========"
ps xl |grep $$ |grep -v grep
  • 通过 $! 获取子进程的PID,再使用 trap 捕获退出信号时将其杀死

 

3. shell 高并发

通过上述的方法了解的子进程实现的原理后,高并发就非常的简单(for循环)

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

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值