shell 异步任务模拟多线程

Posted catoop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 异步任务模拟多线程相关的知识,希望对你有一定的参考价值。

本文通过使用 shell 的子任务方式,来实现类似多线程的效果。

一、wait 命令介绍

语法:wait [作业指示或进程号]

1、等待作业号或者进程号指定的进程退出,返回最后一个作业或进程的退出状态状态。如果没有指定参数,则等待所有子进程的退出,其退出状态为0。

2、如果是shell中等待使用wait,则不会等待调用函数中子任务。在函数中使用wait,则只等待函数中启动的后台子任务。

3、在shell中使用wait命令,相当于高级语言里的多线程同步。就是所有子任务全部执行完成后再继续主线程。

二、启动后台子任务方法

在执行命令后加&操作符,表示将命令放在子shell中异步执行,如下:

#1.等待10秒后再继续执行后续操作
sleep 10
#2.当前shell不等待,后台子shell等待 
sleep 10 & 

三、示例

1、使用 wait 等待所有子任务结束

#!/bin/bash  
sleep 10 &  
sleep 5&  
wait   

这里的 wait 会在等待10秒后(也就是等待时间最长的最后一个子任务完成),退出

2、使用 wait 等待指定的子任务结束

#!/bin/bash  
sleep 10 &  
sleep 5&  
wait $!  

$! 表示上个子进程的进程号。这里的 wait 等待上一个子进程(5秒的那个)结束后,退出

3、在函数中使用 wait

#!/bin/bash  
source ~/.bashrc  

myfun(){  
    local timeNum=$1  
    echo "my function is begin, timeNum: $timeNum"  
    sleep $timeNum &  
    wait #这个只等待wait前面sleep 
    echo "fun is end, timeNum:$timeNum"  
}  

myfun 10 &  
myfun 20 &  

wait # 这里没有需要等待的,因为上面两行调用函数都是异步方式,它不会等待fun里面的sleep  
echo "all is ending"  

输出结果为:

fun is begin, timeNum: 10  
fun is begin, timeNum: 20  
fun is end, timeNum: 10  
fun is end, timeNum: 20  
all is ending

从输出结果我们还能发现一个结论:整个脚本会等待了所有子任务都完成才会退出。


(END)

以上是关于shell 异步任务模拟多线程的主要内容,如果未能解决你的问题,请参考以下文章

Python异步编程全攻略

Shell多线程脚本

异步任务片段背景数据

shell多线程

SpringBoot异步定时邮件任务

在控制台应用程序中,为啥在等待的异步任务中使用同步阻塞代码 (Thread.Sleep(..)) 的行为类似于多线程? [复制]