Linux系统运维:http://www.linuxyw.com,QQ交流群:244914685

Linux系统运维

当前位置: 首页 > 脚本 >

shell多线程并发,并控制线程数量

时间:2013-04-03 23:20来源:转载 作者:网络 点击:
shell利用多线程技术,可以增加工作效率,如果线程同时运行过多,则要限制线程数量,否则服务端压力会很大。

转载请注明出处: Linux系统运维 http://www.linuxyw.com/linux/jiaoben/20130403/14.html


转:http://hi.baidu.com/gavensun_wang/item/51b2b66df3fe4c1da1cf0fcd

exec命令的介绍http://www.linuxidc.com/Linux/2011-01/31400p3.htm

http://blog.csdn.net/21aspnet/article/details/7487770

 

原始脚本如下:
#!/bin/bash

SEND_THREAD_NUM=13
tmp_fifofile="/tmp/$$.fifo"
mkfifo "$tmp_fifofile"
exec 6<>"$tmp_fifofile"

for ((i=0;i<$SEND_THREAD_NUM;i++))

do
                 echo                                                                                    
done >&6

for i in `seq 1 100`

do                                                        
                 read -u6                                                                        

                 {
                                 echo $i                                                 
                                 sleep 3                                                 
                                 echo >&6                                        
                 } &

                pid=$!
                echo $pid
done

wait

exec 6>&-

exit 0


以下为详细注解。

#设置线程数,在这里所谓的线程,其实就是几乎同时放入后台(使用&)执行的进程。
SEND_THREAD_NUM=13
# 脚本运行的当前进程ID号作为文件名,其实这样命名只是为了防止创建管道文件时与现有文件名重复,从而引起创建失败,别无他用。
tmp_fifofile="/tmp/$$.fifo"                  
#创建管道文件
mkfifo "$tmp_fifofile" 
#把文件描述符6指向管道文件,文件描述符可以使用3-9任意一个即可(除了5),0、1、2、5已有定义,具体可参考关于文件描述符的文章。
EXEC 6<>"$tmp_fifofile"            
#删除管道文件,其实删不删无所谓,看你自己了。
rm -f $tmp_fifofile

#使用一个for循环向管道中输入$SEND_THREAD_NUM个空行;>符号为输出重导向;&符号表示6为文件描述符,也就是说&6表示文件描述符6.
for ((i=0;i<$SEND_THREAD_NUM;i++));do
         echo                                        
done >&6

for i in `seq 1 100`;do                            # 100 次 for 循环开始,也就是说表示100次你的实际应用
         read -u6                                    # 从文件描述符6(即管道)中读取行,每次读一行,由于是管道,读一行,管道中便少一行,每次只能读取一行,注意:如果读完了,便会挂起,直到管道中再次有可读的行。

         {
                 echo $i                         # 打印i,这里代表整个脚本的应用部分,可以替换成你的实际应用。
                sleep 3                         # 暂停3秒,这里是关键点,其实引入管道模拟多线程的关键就是为了这个暂停的3秒(实际上是微大于3秒的),让系统有个缓冲的时间,起到限制所谓并发的进程数量。
                 echo >&6                    # 再次往管道文件中写入一个空行,为了挂起的for循环能够继续执行。

本文来自linux系统运维http://www.linuxyw.com/linux/jiaoben/20130403/14.html

顶一下
(2)
100%
踩一下
(0)
0%
分享按钮
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片