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

注意下面注释中带“>>>>>”的位置

 

情况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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值