0
也許真的很簡單的問題,但我不知道在哪裏挖。 我有文件的列表(隨機的名字),我想使用一些命令批處理文件在bash中處理完全佔用處理器
processing_command $i ${i%.*}.txt
我想加快利用所有的處理器來處理它們。如何使這樣的腳本同時佔用10個處理器(通過處理10個文件)? processing_command默認情況下不是並行的。謝謝!
也許真的很簡單的問題,但我不知道在哪裏挖。 我有文件的列表(隨機的名字),我想使用一些命令批處理文件在bash中處理完全佔用處理器
processing_command $i ${i%.*}.txt
我想加快利用所有的處理器來處理它們。如何使這樣的腳本同時佔用10個處理器(通過處理10個文件)? processing_command默認情況下不是並行的。謝謝!
瑣碎的方法是使用:
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
工作起來就像一個魅力! ) –
PMAX = $(ls -1d/sys/devices/system/cpu/cpu * | wc -l) - 實際上也列出了一些cpufreq和cpuidle,但是PMAX = $(ls -1d/sys/devices/system/cpu/cpu [0-9] * | wc -l)根據需要工作。 –
天哪!我不能投兩次) –