浅尝shell脚本并发
作者:互联网
默认情况下,shell脚本中的命令是串行执行的,必须等到前一条命令执行完毕之后才执行接下来的命令,但是如果有一大批的命令需要执行,而且互相之间又没有影响的情况下,可以采用并发执行的方式执行。
正常情况下的shell脚本如下:
#!/bin/bash
for ((i=0;i<5;i++));do
{
sleep 3
echo "hello world" >> aa && echo "done!"
}
done
cat aa | wc -l
rm aa
使用time命令查看此脚本的执行时间,结果如下:
[root@ali shell]# time sh echo_hello.sh
done!
done!
done!
done!
done!
5
real 0m15.012s #15s
user 0m0.006s
sys 0m0.006s
可以看到执行耗时为15秒左右。现在改造一下脚本使它并发执行,脚本如下:
#!/bin/bash
for ((i=0;i<5;i++));do
{
sleep 3
echo "hello world" >> aa && echo "done!"
}&
done
wait
cat aa | wc -l
rm aa
同样,查看执行耗时:
[root@ali shell]# time sh echo_hello.sh
done!
done!
done!
done!
done!
5
real 0m3.011s #3s
user 0m0.007s
sys 0m0.005s
可以看到,仅消耗了3s。
wait命令有一个很重要的用途就是在shell的并发编程中,可以在shell脚本中启动多个后台进程(使用“&”),然后调用wait命令,等待所有后台进程都运行完毕,shell脚本再继续往下执行。
注意:当多个进程可能会对同样的数据执行操作时,这些进程需要保证其他进程没有在操作,以免损坏数据。通常,这样的进程会使用一个“锁文件”,也就是建立一个文件来告诉别的进程自己在运行,如果检测到存在那个文件,则认为有操作同样数据的进程在工作。当然,这么做也有一个弊端,如果进程不小心意外死亡了,都没有清理那个锁文件,那么只能由用户手动来清理了。
Shell多进程并发
如果逻辑控制在时间上是重叠的,那么它们就是并发的,这种常见的现象称为并发,shell多进程并发常出现在计算机系统的不同层面上。
使用应用级并发的应用程序称为并发程序。现代操作系统提供了三种基本的构造并发程序的方法,具体如下:
- 进程:若采用这种方法,则每个逻辑控制流都是一个进程,由内核来调度和维护。因为进程有独立的虚拟地址空间,因此要想与其他流进行通信,控制流必须使用进程间通信(IPC)
- I/O多路复用:若采用这种形式的并发,则应用程序在一个进程的上下文中显式地调度它们自己的逻辑流。逻辑流被模拟为“状态机”,数据到达文件描述符之后,主程序显式地从一个状态转换到另一个状态。因为程序是一个单独的进程,所以所有的流都共享一个地址空间
- 线程:线程是一个运行在单一进程上下文中的逻辑流,由内核进行调度。线程可以看做是进程和I/O多路复用的合体,像进程一样由内核调度,像I/O多路复用一样共享一个虚拟地址空间。
标签:aa,shell,浅尝,并发,done,进程,执行 来源: https://www.cnblogs.com/Torres-tao/p/16440226.html