您的位置:首页 > 运维架构 > Shell

SHELL中的使用fifo管道实现多进程运行效率

2012-09-11 17:34 239 查看
注意下面注释中带“>>>>>”的位置

情况1:

#!/bin/bash

temp_fifo_file=$$.info        #以当前进程号,为临时管道取名
mkfifo $temp_fifo_file        #创建临时管道
exec 6<>$temp_fifo_file       #创建标识为6,可以对管道进行读写
rm $temp_fifo_file            #清空管道内容

function f_sleep
{
sleep 2
}

temp_thread=2                 #进程数

for ((i=0;i<temp_thread;i++)) #为进程创建相应的占位
do
echo                        #每个echo输出一个回车,为每个进程创建一个占位
done >&6                      #将占位信息写入标识为6的管道

for ((i=0;i<6;i++))
do
read                        #获取标识为6的占位
{
f_sleep
echo $$,$i,`date`
sleep 5
echo $$,$i,`date`
echo >&6                  #>>>>>当任务执行完后,会释放管道占位,所以补充一个占位
}&                          #>>>>>在后台执行{}中的任务
done <&6                      #将标识为6的管道作为标准输入

wait                          #等待所有任务完成
exec 6>&-                     #关闭标识为6的管道
> date ; ./thread_1.sh
Tue Jun 19 17:12:36 TAIST 2012
4032,0,Tue Jun 19 17:12:38 TAIST 2012
4032,1,Tue Jun 19 17:12:38 TAIST 2012
4032,0,Tue Jun 19 17:12:43 TAIST 2012
4032,1,Tue Jun 19 17:12:43 TAIST 2012
4032,2,Tue Jun 19 17:12:45 TAIST 2012
4032,3,Tue Jun 19 17:12:45 TAIST 2012
4032,2,Tue Jun 19 17:12:50 TAIST 2012
4032,3,Tue Jun 19 17:12:50 TAIST 2012
4032,4,Tue Jun 19 17:12:52 TAIST 2012
4032,5,Tue Jun 19 17:12:52 TAIST 2012
4032,4,Tue Jun 19 17:12:57 TAIST 2012
4032,5,Tue Jun 19 17:12:57 TAIST 2012

21s


情况2:

#!/bin/bash

temp_fifo_file=$$.info        #以当前进程号,为临时管道取名
mkfifo $temp_fifo_file        #创建临时管道
exec 6<>$temp_fifo_file       #创建标识为6,可以对管道进行读写
rm $temp_fifo_file            #清空管道内容

function f_sleep
{
sleep 2
}

temp_thread=2                 #进程数

for ((i=0;i<temp_thread;i++)) #为进程创建相应的占位
do
echo                        #每个echo输出一个回车,为每个进程创建一个占位
done >&6                      #将占位信息写入标识为6的管道

for ((i=0;i<6;i++))
do
read                        #获取标识为6的占位
{
f_sleep
echo $$,$i,`date`
}&                          #>>>>>在后台执行{}中的任务
sleep 5
echo $$,$i,`date`
echo >&6                    #>>>>>当任务执行完后,会释放管道占位,所以补充一个占位
done <&6                      #将标识为6的管道作为标准输入

wait                          #等待所有任务完成
exec 6>&-                     #关闭标识为6的管道
> date ; ./thread_1.sh
Tue Jun 19 17:18:28 TAIST 2012
6288,0,Tue Jun 19 17:18:30 TAIST 2012
6288,0,Tue Jun 19 17:18:33 TAIST 2012
6288,1,Tue Jun 19 17:18:35 TAIST 2012
6288,1,Tue Jun 19 17:18:38 TAIST 2012
6288,2,Tue Jun 19 17:18:40 TAIST 2012
6288,2,Tue Jun 19 17:18:43 TAIST 2012
6288,3,Tue Jun 19 17:18:45 TAIST 2012
6288,3,Tue Jun 19 17:18:48 TAIST 2012
6288,4,Tue Jun 19 17:18:50 TAIST 2012
6288,4,Tue Jun 19 17:18:53 TAIST 2012
6288,5,Tue Jun 19 17:18:55 TAIST 2012
6288,5,Tue Jun 19 17:18:58 TAIST 2012

30s


情况3:

#!/bin/bash

temp_fifo_file=$$.info        #以当前进程号,为临时管道取名
mkfifo $temp_fifo_file        #创建临时管道
exec 6<>$temp_fifo_file       #创建标识为6,可以对管道进行读写
rm $temp_fifo_file            #清空管道内容

function f_sleep
{
sleep 2
echo >&6                    #>>>>>当任务执行完后,会释放管道占位,所以补充一个占位
}

temp_thread=2                 #进程数

for ((i=0;i<temp_thread;i++)) #为进程创建相应的占位
do
echo                        #每个echo输出一个回车,为每个进程创建一个占位
done >&6                      #将占位信息写入标识为6的管道

for ((i=0;i<6;i++))
do
read                        #获取标识为6的占位
{
f_sleep
echo $$,$i,`date`
}&                          #>>>>>在后台执行{}中的任务
sleep 5
echo $$,$i,`date`
done <&6                      #将标识为6的管道作为标准输入

wait                          #等待所有任务完成
exec 6>&-                     #关闭标识为6的管道
> date ; ./thread_1.sh
Tue Jun 19 17:17:06 TAIST 2012
5777,0,Tue Jun 19 17:17:08 TAIST 2012
5777,0,Tue Jun 19 17:17:11 TAIST 2012
5777,1,Tue Jun 19 17:17:13 TAIST 2012
5777,1,Tue Jun 19 17:17:16 TAIST 2012
5777,2,Tue Jun 19 17:17:18 TAIST 2012
5777,2,Tue Jun 19 17:17:21 TAIST 2012
5777,3,Tue Jun 19 17:17:23 TAIST 2012
5777,3,Tue Jun 19 17:17:26 TAIST 2012
5777,4,Tue Jun 19 17:17:28 TAIST 2012
5777,4,Tue Jun 19 17:17:31 TAIST 2012
5777,5,Tue Jun 19 17:17:33 TAIST 2012
5777,5,Tue Jun 19 17:17:36 TAIST 2012

30s


情况4:

#!/bin/bash

temp_fifo_file=$$.info        #以当前进程号,为临时管道取名
mkfifo $temp_fifo_file        #创建临时管道
exec 6<>$temp_fifo_file       #创建标识为6,可以对管道进行读写
rm $temp_fifo_file            #清空管道内容

function f_sleep
{
sleep 2
echo >&6                    #>>>>>当任务执行完后,会释放管道占位,所以补充一个占位
}

temp_thread=2                 #进程数

for ((i=0;i<temp_thread;i++)) #为进程创建相应的占位
do
echo                        #每个echo输出一个回车,为每个进程创建一个占位
done >&6                      #将占位信息写入标识为6的管道

for ((i=0;i<6;i++))
do
read                        #获取标识为6的占位
{
f_sleep
echo $$,$i,`date`
sleep 5
echo $$,$i,`date`
}&                          #>>>>>在后台执行{}中的任务
done <&6                      #将标识为6的管道作为标准输入

wait                          #等待所有任务完成
exec 6>&-                     #关闭标识为6的管道
> date ; ./thread_1.sh
Tue Jun 19 17:16:11 TAIST 2012
5367,0,Tue Jun 19 17:16:13 TAIST 2012
5367,1,Tue Jun 19 17:16:13 TAIST 2012
5367,3,Tue Jun 19 17:16:15 TAIST 2012
5367,2,Tue Jun 19 17:16:15 TAIST 2012
5367,4,Tue Jun 19 17:16:17 TAIST 2012
5367,5,Tue Jun 19 17:16:17 TAIST 2012
5367,0,Tue Jun 19 17:16:18 TAIST 2012
5367,1,Tue Jun 19 17:16:18 TAIST 2012
5367,3,Tue Jun 19 17:16:20 TAIST 2012
5367,2,Tue Jun 19 17:16:20 TAIST 2012
5367,4,Tue Jun 19 17:16:22 TAIST 2012
5367,5,Tue Jun 19 17:16:22 TAIST 2012

11s
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: