bash shell实现并发多进程操作

前言

目前我掌握的基本语言,php(最为熟悉,项目里代码都是用其实现),bash shell(运维利器),c(acm专用),这里面能实现多线程的貌似只有c,但是我c只是用来学习和实现算法和数据结构,因此工作中我想要模拟多进程并发操作,就只能依靠bash shell脚本了

技能点

shell脚本里实现并发操作,需要用到
for循环
&后台运行符
wait等待所有子进程结束


思路

我们可以通过写一个for循环,控制每次需要批量操作的次数,然后封装一个方法,方法里进行批量操作,并将此方法用&符号放在后台运行每个循环结束前用wait函数,确保当前批量处理操作全部完成。

示例

    我们准备批量的执行创建目录操作,目录名称为数字,从1开始到100,每次批量创建20个

(1)无并发时

代码如下:

#!/bin/bash

#开始时间
begin=$(date +%s)

#测试根目录
root_dir="/Users/a6/Applications/experiment_data/0703"

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}秒"

运行时间如下:

MacBook-Pro:experiment_data a6$ bash ./without_bingfa.sh
花费时间为68秒

(2)并发操作

我们每次并发创建200个目录,因此循环执行50次即可实现创建10000个目录的工作

代码如下:

#!/bin/bash

#开始时间
begin=$(date +%s)

#测试根目录
root_dir="/Users/a6/Applications/experiment_data/0703"

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}秒"

主要是分页处理和&以及wait的使用

运行时间如下:

MacBook-Pro:experiment_data a6$ bash ./with_bingfa.sh
花费时间为22秒

总结

通过&、wait和for循环来进行并发操作能显著的提高效率,大家可以参考这个方法用在自己的日常工作中,我是在创建多个mysql库的时候掌握了这个方法!

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值