也许真的很简单的问题,但我不知道在哪里挖掘。我有一个文件列表(随机名称),我想使用一些命令来处理它们
processing_command $i ${i%.*}.txt
我想通过使用所有处理器来加快速度。如何使这样的脚本同时占用 10 个处理器(通过处理 10 个文件)?processing_command 默认情况下不是并行的。谢谢!
也许真的很简单的问题,但我不知道在哪里挖掘。我有一个文件列表(随机名称),我想使用一些命令来处理它们
processing_command $i ${i%.*}.txt
我想通过使用所有处理器来加快速度。如何使这样的脚本同时占用 10 个处理器(通过处理 10 个文件)?processing_command 默认情况下不是并行的。谢谢!
简单的方法是使用:
for i in $items
do
processing_command $i ${i%.*}.txt &
done
这将为每个 $i 启动一个新的(并行实例)processing_command
(诀窍是&
将进程作为背景的尾随)缺点是,如果您有例如 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 "$@"; 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 "$@"; 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