美文网首页深度分析
shell并发,并行

shell并发,并行

作者: 小潤澤 | 来源:发表于2020-03-19 20:46 被阅读0次

    简介

    首先明确,程序在执行的时候是串行执行的,那么在程序执行中往往可以利用并发和并行来优化

    那么并发和并行的区别是什么?
    并行抓住一个关键词,那就是多个程序是否同时执行
    并发并不一定是要同时执行,所以并行是并发的一个子集,并发强调的是系统具有处理多个任务的能力,但不一定要同时;并行也是用于描述统具有处理多个任务的能力,但一定是同时运行

    并行

    那么我们看下用shell怎么来写并行,这里只介绍一种方法

     #!/bin/bash
     for i in (recurrency)
      do
     {
           express
     } &
    done
    wait  ##等待所有子后台进程结束
    

    典型的是大括号加&,wait则是等待所有子程序结束

    我们看下串行和并行的区别

    #!/bin/bash
    date
    for i in `seq 1 5`
    do
     {
         echo "sleep 5"
         sleep 5
     }
    done
    date
    

    再来看看并行处理

     #!/bin/bash
    date
    for i in `seq 1 5`
    do
     {
         echo "sleep 5"
         sleep 5
     } &
    done
    wait  ##等待所有子后台进程结束
    date
    

    关于输出5个数,我们可以对比下时间,显然并行速度更快

    并发

    关于并发,我们用建立文件夹为例子
    无并发

    #!/bin/bash
    
    #开始时间
    begin=$(date +%s)
    
    #测试根目录
    root_dir="/home/tes1"
    
    if [ ! -d $root_dir ]; then
            mkdir -p $root_dir
    fi
    cd $root_dir
    
    
    #循环创建10000个目录
    for ((i=0; i<10000; ))
    do
            mkdir $i
            i=$(expr $i + 1)
    done
    
    #结束时间
    end=$(date +%s)
    spend=$(expr $end - $begin)
    echo "花费时间为$spend秒"
    

    循环建立10000个文件夹,处理时间为


    所用时间
    结果

    现在用并发来看看

    #!/bin/bash
    
    #开始时间
    begin=$(date +%s)
    
    #测试根目录
    root_dir="/home/tes2"
    
    if [ ! -d $root_dir ]; then
            mkdir -p $root_dir
    fi
    cd $root_dir
    
    #批量创建目录函数
    function create_dir()
    {
    
            mkdir $1
    }
    
    #循环创建10000个目录
    count=10000
    rsnum=200
    cishu=$(expr $count / $rsnum)
    
    for ((i=0; i<$cishu;))
    do
            start_num=$(expr $i \* $rsnum + $i)
            end_num=$(expr $start_num + $rsnum)
            for j in `seq $start_num $end_num`
            do
                    create_dir $j &
            done
            wait
            i=$(expr $i + 1)
    done
    
    #结束时间
    end=$(date +%s)
    spend=$(expr $end - $begin)
    echo "花费时间为$spend秒"
    
    
    所用时间

    做并发有什么特征呢?比方说我们要建立文件夹,那么就先写一个建立文件夹的函数
    以这个例子来看,我们要建立10000个文件夹,那么我们200个为一组,注意那个嵌套循环体:
    第一个循环,是200个一组,里面的循环是以200个为一个基数,建立文件夹
    我们不妨把start_num输出一下:


    添加代码输出

    再有就是第二层循环的&,相当于并发建立文件夹(一起建立)wait等待子程序完成,这样速度快一些

    参考:https://blog.csdn.net/wzy_1988/article/details/8811153

    相关文章

      网友评论

        本文标题:shell并发,并行

        本文链接:https://www.haomeiwen.com/subject/xmblyhtx.html