bash shell实现并发多进程操作
前言
目前我掌握的基本语言,php(最为熟悉,项目里代码都是用其实现),bash shell(运维利器),c(acm专用),这里面能实现多线程的貌似只有c,但是我c只是用来学习和实现算法和数据结构,因此工作中我想要模拟多进程并发操作,就只能依靠bash shell脚本了
技能点
shell脚本里实现并发操作,需要用到
- for循环
- &后台运行符
- wait等待所有子进程结束
思路
- 我们可以通过写一个for循环,控制每次需要批量操作的次数,
- 然后封装一个方法,方法里进行批量操作,并将此方法用&符号放在后台运行
- 每个循环结束前用wait函数,确保当前批量处理操作全部完成
示例
我们准备批量的执行创建目录操作,目录名称为数字,从1开始到100,每次批量创建20个
无并发时
代码如下:
#!/bin/bash #开始时间 begin=$(date +%s) #测试根目录 root_dir="/home/wzy/wzy_scripts/file_scripts/test" 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秒"
![](http://img-my.csdn.net/uploads/201304/16/1366119910_9907.png)
并发操作
我们每次并发创建200个目录,因此循环执行50次即可实现创建10000个目录的工作
代码如下:
#!/bin/bash #开始时间 begin=$(date +%s) #测试根目录 root_dir="/home/wzy/wzy_scripts/file_scripts/test" 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的使用
运行时间:
![](http://img-my.csdn.net/uploads/201304/16/1366121135_5992.png)
总结
通过&、wait和for循环来进行并发操作能显著的提高效率,大家可以参考这个方法用在自己的日常工作中,我是在创建多个mysql库的时候掌握了这个方法!