shell 多線程

注意下面註釋中帶“>>>>>”的位置

 

情況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 
來源:CSDN 
原文:https://blog.csdn.net/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)實現每次啓動後臺進程數量可控。 

 

參考:https://www.cnblogs.com/xudong-bupt/p/6079849.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章