Bash

如何並行執行腳本的 x 個實例?

  • September 25, 2016

我有腳本,我總是希望並行執行“x”個實例。

程式碼看起來像這樣:

for A in 
do
 for B in
 do
   (script1.sh $A $B;script2.sh $A $B) &
 done #B
done #A

腳本本身執行數據庫查詢,因此它將受益於並行執行。問題是

1)“等待”不起作用(因為它完成了所有後台作業並開始新的作業(即使我包括一個執行緒計數器),這會浪費大量時間。

2)我不知道如何平行地做到這一點。我只找到了相同腳本多次執行但沒有使用不同參數的範例。

3)替代解決方案是:

for A in 
do
 for B in
 do
   while threadcount>X 
   do
     sleep 60
   done
   (script1.sh $A $B;script2.sh $A $B) &
 done #B
done #A

但是我並沒有真正弄清楚如何使執行緒數可靠。

一些指向正確方向的提示非常受歡迎。


我很想使用並行,但是正如文件告訴我的那樣,事情只是不起作用。

我願意

parallel echo ::: A B C ::: D E F

(來自文件)它告訴我

parallel: Input is read from the terminal. Only experts do this on purpose. Press CTRL-D to exit.

這只是手冊頁中最簡單的範例。

使用 GNU Parallel 它看起來像這樣:

parallel script1.sh {}';' script2.sh {} ::: a b c ::: d e f

它將為每個 CPU 生成一個作業。

GNU Parallel 是一個通用的並行化器,可以輕鬆地在同一台機器上或在您可以通過 ssh 訪問的多台機器上並行執行作業。它通常可以替換for循環。

如果您想在 4 個 CPU 上執行 32 個不同的作業,那麼並行化的直接方法是在每個 CPU 上執行 8 個作業:

簡單的調度

GNU Parallel 會在完成後生成一個新程序 - 保持 CPU 處於活動狀態,從而節省時間:

GNU 並行調度

安裝

如果沒有為您的發行版打包 GNU Parallel,您可以進行個人安裝,這不需要 root 訪問權限。這樣做可以在 10 秒內完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

有關其他安裝選項,請參閱http://git.savannah.gnu.org/cgit/parallel.git/tree/README

學到更多

查看更多範例:http ://www.gnu.org/software/parallel/man.html

觀看介紹影片:https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

瀏覽教程:http ://www.gnu.org/software/parallel/parallel_tutorial.html

註冊電子郵件列表以獲得支持:https ://lists.gnu.org/mailman/listinfo/parallel

引用自:https://unix.stackexchange.com/questions/211976