注意下面注释中带“>>>>>”的位置
情况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
---------------------
作者:wqq_721
来源:优快云
原文:https://blog.youkuaiyun.com/wqq_721/article/details/7968099
版权声明:本文为博主原创文章,转载请附上博文链接!
linux shell 多线程执行程序
Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能。
直接看代码示例吧。
(1) 顺序执行的代码
1 #!/bin/bash 2 date 3 for i in `seq 1 5` 4 do 5 { 6 echo "sleep 5" 7 sleep 5 8 } 9 done 10 date
输出:
Sat Nov 19 09:21:51 CST 2016 sleep 5 sleep 5 sleep 5 sleep 5 sleep 5 Sat Nov 19 09:22:16 CST 2016
(2) 并行代码
使用'&'+wait 实现“多进程”实现
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码
输出:
Sat Nov 19 09:25:07 CST 2016 sleep 5 sleep 5 sleep 5 sleep 5 sleep 5 Sat Nov 19 09:25:12 CST 2016
(3) 对于大量处理任务如何实现启动后台进程的数量可控?
简单的方法可以使用2层for/while循环实现,每次wait内层循环的多个后台程序执行完成。
但是这种方式的问题是,如果内层循环有“慢节点”可能导致整个任务的执行执行时间长。
更高级的实现可以看(4)
(4) 使用命名管道(fifo)实现每次启动后台进程数量可控。