2013-03-11 88 views
5

我有權訪問一臺可以訪問10個內核的機器 - 我想實際使用它們。我已經習慣了做我自己的機器上是這樣的:Bash:在多個內核上運行相同的程序

for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" 
done 

我有10個文件,我想這樣做的 - 我們姑且稱之爲blah00.fa,blah01.fa,.. blah09.fa。

這種方法的問題是,myProgram一次只能使用1個內核,在多核機器上這樣做我會一次使用1個內核10次,所以我不會使用我的mahcine到最大的能力。

我該如何更改我的腳本,以便它可以同時運行我所有10個.fa文件?我看着Run a looped process in bash across multiple cores,但我無法從那裏得到命令去做我想要的東西。

+2

您試過'gnu parallel'嗎?什麼不適合你? – 2013-03-11 16:27:08

+1

您是否嘗試過在該答案中使用gnu並行建議? – 2013-03-11 16:27:11

+2

'seq 0 10 | parallel myProgram -opt1 -opt2 ./blah{}.fa ./blah {}。tmp' – 2013-03-11 16:31:32

回答

8

你可以使用

for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" & 
done 
wait 

這將啓動所有的你在並行作業,然後等到他們所有完整的移動之前。如果你的內核比內核多,你可以啓動所有內核,讓你的操作系統調度程序擔心交換進程。

一個修改是一次

count=0 
for f in *.fa; do 
    myProgram (options) "./$f" "./$f.tmp" & 
    ((count ++))   
    if ((count = 10)); then 
     wait 
     count=0 
    fi 
done 

啓動10個就業機會,而且這是不如使用parallel因爲舊的結束,你不能啓動新的工作,你也不能如果檢測在開始10個工作之前完成較早的工作。 wait允許您等待單個特定進程或全部後臺進程,但不會讓您知道何時完成任意一組任意後臺進程。

+2

下一個版本的Bash將會有一個選項('wait -n' )。目前你可以做一些類似於[this](https://gist.github.com/ormaaj/3911059)的東西,但由於一些錯誤,這些錯誤也會在下一個版本中修復。 – ormaaj 2013-03-12 09:05:03

4

隨着GNU並行,你可以這樣做:

parallel myProgram (options) {} {.}.tmp ::: *.fa 

來源:http://git.savannah.gnu.org/cgit/parallel.git/tree/README

=完全安裝=

GNU並行的完全安裝很簡單,只要:

./configure && make && make install 

如果您不是root用戶,可以將〜/ bin添加到您的路徑並安裝在012中〜/ bin和〜/股:

./configure --prefix=$HOME && make && make install 

或者,如果你的系統缺乏 '使' 你可以簡單的src /並行 的src/SEM的src/niceload的src/SQL複製到您的路徑中的目錄。

=最小安裝=

如果你只需要並行,不具備「讓」安裝(也許 系統是舊的或Microsoft Windows):

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 
mv parallel sem dir-in-your-$PATH/bin/ 

觀看介紹視頻學習更多:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

0
# Wait while instance count less than $3, run additional instance and exit 
function runParallel() { 
    cmd=$1 
    args=$2 
    number=$3 
    currNumber="1024" 
    while true ; do 
     currNumber=`ps -e | grep -v "grep" | grep " $1$" | wc -l` 
     if [ $currNumber -lt $number ] ; then 
      break 
     fi 
     sleep 1 
    done 
    echo "run: $cmd $args" 
    $cmd $args & 
} 

loop=0 
# We will run 12 sleep commands for 10 seconds each 
# and only five of them will work simultaneously 
while [ $loop -ne 12 ] ; do 
    runParallel "sleep" 10 5 
    loop=`expr $loop + 1` 
done 
相關問題