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 异步任务模拟多线程的主要内容,如果未能解决你的问题,请参考以下文章
在控制台应用程序中,为啥在等待的异步任务中使用同步阻塞代码 (Thread.Sleep(..)) 的行为类似于多线程? [复制]