2013-06-21 35 views
0

也許真的很簡單的問題,但我不知道在哪裏挖。 我有文件的列表(隨機的名字),我想使用一些命令批處理文件在bash中處理完全佔用處理器

processing_command $i ${i%.*}.txt 

我想加快利用所有的處理器來處理它們。如何使這樣的腳本同時佔用10個處理器(通過處理10個文件)? processing_command默認情況下不是並行的。謝謝!

回答

2

瑣碎的方法是使用:

for i in $items 
do 
    processing_command $i ${i%.*}.txt & 
done 

將開始一個新的(平行的實例)processing_command每個$ I(訣竅是尾隨&這將後臺處理) 缺點是的,如果你有,例如1000個項目,那麼這將啓動1000個並行進程,其中(佔用全部10個核心)將忙於進行上下文切換而不是進行實際處理。如果你有多少(或更少)項目作爲內核,那麼這是一個不錯的簡單解決方案。

通常你不想啓動比核心更多的進程。

一個簡單的方法(假設所有項目在處理時都需要大致相同的時間)是將原始「項目」列表拆分爲長度相等的列表number_of_cores。以下是從德國文章linux-magazin中摘取的一個示例的稍微修改版本:

#!/bin/bash 


## number of processors 
PMAX=$(ls -1d /sys/devices/system/cpu/cpu[0-9]* | wc -l) 

## call processing_command on each argument: 
doSequential() { 
    local i 
    for i in "[email protected]"; do 
    processing_command $i ${i%.*}.txt 
    done 
} 

## run PMAX parallel processes 
doParallel() { 
    # split the arguments into PMAX equally sized lists 
    local items item currentProcess=0 
    for item in "[email protected]"; do 
    items[$currentProcess]="${items[$currentProcess]} "$item"" 
     shift 
    let currentProcess=$(((currentProcess+1)%PMAX)) 
    done 

    # run PMAX processes, each with the shorter list of items 
    currentProcess=0 
    while [ $currentProcess -lt $PMAX ]; do 
     [ -n "${items[$currentProcess]}" ] && 
     eval doSequential ${items[$currentProcess]} & 
     currentProcess=$((currentProcess+1)) 
    done 
    wait 
} 

doParallel $ITEMS 
+0

工作起來就像一個魅力! ) –

+0

PMAX = $(ls -1d/sys/devices/system/cpu/cpu * | wc -l) - 實際上也列出了一些cpufreq和cpuidle,但是PMAX = $(ls -1d/sys/devices/system/cpu/cpu [0-9] * | wc -l)根據需要工作。 –

+0

天哪!我不能投兩次) –