Java教程

浅尝shell脚本并发

本文主要是介绍浅尝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多进程并发常出现在计算机系统的不同层面上。

​ 使用应用级并发的应用程序称为并发程序。现代操作系统提供了三种基本的构造并发程序的方法,具体如下:

  1. 进程:若采用这种方法,则每个逻辑控制流都是一个进程,由内核来调度和维护。因为进程有独立的虚拟地址空间,因此要想与其他流进行通信,控制流必须使用进程间通信(IPC)
  2. I/O多路复用:若采用这种形式的并发,则应用程序在一个进程的上下文中显式地调度它们自己的逻辑流。逻辑流被模拟为“状态机”,数据到达文件描述符之后,主程序显式地从一个状态转换到另一个状态。因为程序是一个单独的进程,所以所有的流都共享一个地址空间
  3. 线程:线程是一个运行在单一进程上下文中的逻辑流,由内核进行调度。线程可以看做是进程和I/O多路复用的合体,像进程一样由内核调度,像I/O多路复用一样共享一个虚拟地址空间。
这篇关于浅尝shell脚本并发的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!