Linux Shell实现多进程并发执行

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 21:27 点击:

在bash中,使用后台任务来实现任务的“多进程化”。在不加控制的模式下,不管有多少任务,全部都后台执行。也就是说,在这种情况下,有多少任务就有多少“进程”在同时执行。我们就先实现第一种情况:
实例一:正常情况脚本
———————————————————————————–
#!/bin/bash

for ((i=0;i<5;i++));do
{
sleep 1;echo 1>>aa && echo ”done!”
 }
done
cat aa|wc -l
rm aa
———————————————————————————–
这种情况下,程序顺序执行,每个循环3s,共需15s左右。
$ time bash test.sh
done!
done!
done!
done!
done!
5

real    0m15.030s
user    0m0.002s
sys     0m0.003s
实例二:“多进程”实现
———————————————————————————–
#!/bin/bash

for ((i=0;i<5;i++));do
 {
 sleep 3;echo 1>>aa && echo ”done!”
 } &
done
wait
cat aa|wc -l
rm aa
———————————————————————————–
这个实例实际上就在上面基础上多加了一个后台执行&符号,此时应该是5个循环任务并发执行,最后需要3s左右时间。
$ time bash test.sh
done!
done!
done!
done!
done!
5

   real    0m3.011s
user    0m0.002s
sys     0m0.004s
效果非常明显。
这里需要说明一下wait的左右。wait是等待前面的后台任务全部完成才往下执行,否则程序本身是不会等待的,这样对后面依赖前面任务结果的命令来说就可能出错。例如上面wc -l的命令就报错:不存在aa这个文件。
以上所讲的实例都是进程数目不可控制的情况,下面描述如何准确控制并发的进程数目。
——————————————————————————————————————
#!/bin/bash
# 2006-7-12, by wwy
#———————————————————————————–
# 此例子说明了一种用wait、read命令模拟多线程的一种技巧
# 此技巧往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况
# 还说明了多线程的控制
#———————————————————————————–


function a_sub { # 此处定义一个函数,作为一个线程(子进程)
sleep 3 # 线程的作用是sleep 3s
}


tmp_fifofile=”/tmp/$.fifo”
mkfifo $tmp_fifofile          # 新建一个fifo类型的文件
exec 6<>$tmp_fifofile      # 将fd6指向fifo类型
rm $tmp_fifofile


thread=15 # 此处定义线程数
for ((i=0;i<$thread;i++));do
echo
done >&6 # 事实上就是在fd6中放置了$thread个回车符


for ((i=0;i<50;i++));do # 50次循环,可以理解为50个主机,或其他

read -u6
# 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • /etc/fstab 详解
    • nginx主主集群
    •  LVS-NAT和LVS-DR模式的实现详解
    •  RHCE考试之磁盘配额
    • 学习笔记:ACL详解
    • suse linux双网卡双网关配置
    •  LVM逻辑卷管理器
    •  Nginx主主负载均衡架构
    • ubuntu学习Mysql

    快速直达

    操作系统导航

    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1