2012-01-24 25 views
6

今天的CPU通常包含幾個物理內核。它們甚至可能是多線程的,這樣Linux內核就會看到相當多的內核,並相應地啓動幾次Linux調度器(每個內核一個)。在Linux系統上運行多個任務時,調度程序通常可以將總工作負載分配到所有Linux內核(可能是相同的物理內核)。如何通過每個Linux內核啓動一個任務(平行)與Linux shell並行化?

現在,比方說,我有大量文件要使用相同的可執行文件進行處理。我通常做這個用「find」命令:

find <path> <option> <exec> 

然而,這在任何時候開始只有一個任務,並等待,直到開始下一個任務之前,它的完成。因此,任何時候只有一個核心正在使用。這會使大多數內核空閒(如果此查找命令是在系統上運行的唯一任務)。同時啓動N個任務會更好。其中N是Linux內核看到的內核數量。

有沒有可以做到的命令?

+1

查看GNU並行工具。我不知道它如何適合你的特定問題,但有一個閱讀:http://www.gnu.org/software/parallel/ –

+1

是的,你是對的。 GNU並行的確用於這種用法。它可以用作「xargs」的替代品。 – ritter

+0

@Daniel:好像你應該把它作爲答案。 –

回答

7

使用find-print0選項。使用-0選項將其管至xargsxargs也接受-P選項來指定一些進程。 -P應與-n-L結合使用。

閱讀man xargs瞭解更多信息。

一個例子命令: find . -print0 | xargs -0 -P4 -n4 grep searchstring

+0

非常感謝您的答覆!由於GNU並行並不是我分配的組件,所以xargs是選擇(此刻!)。 – ritter

2

如果你有GNU並行http://www.gnu.org/software/parallel/安裝,你可以這樣做:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

觀看:

find | parallel do stuff {} --option_a\; do more stuff {} 

您只需安裝GNU並行有關GNU Parallel的介紹視頻以瞭解更多信息: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

+0

偉大的介紹視頻。非常感謝!! 不幸的是,GNU並行版本尚未將其納入Ubuntu 11.10。令人難以置信的,這樣一個偉大的工具!不過,我已經讀過它的提示,它會將它變成12.04。好消息!! – ritter

+0

它不在http://www.ubuntuupdates.org/package_metas/list?name=parallel中,所以我想知道你在哪裏閱讀這些提示。 –

0

Gnu parallel或xargs -P可能是更好的方法來處理這個問題,但是您也可以在bash中編寫一個多任務框架。然而,由於缺乏某些設施,這有點混亂和不可靠。

#!/bin/sh 

MAXJOBS=3 
CJ=0 
SJ="" 

gj() { 
    echo ${1//[][-]/} 
} 

endj() { 
    trap "" sigchld 
    ej=$(gj $(jobs | grep Done)) 
    jobs %$ej 
    wait %$ej 
    CJ=$(($CJ - 1)) 
    if [ -n "$SJ" ]; then 
     kill $SJ 
     SJ="" 
    fi 
} 
startj() { 
    j=$* 
    while [ $CJ -ge $MAXJOBS ]; do 
     sleep 1000 & 
     SJ=$! 
     echo too many jobs running: $CJ 
     echo waiting for sleeper job [$SJ] 
     trap endj sigchld 
     wait $SJ 2>/dev/null 
    done 
    CJ=$(($CJ + 1)) 
    echo $CJ jobs running. starting: $j 
    eval "$j &" 
} 

set -m 

# test 
startj sleep 2 
startj sleep 10 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 1 
startj sleep 2 
startj sleep 10 

wait 
相關問題