0

也许真的很简单的问题,但我不知道在哪里挖掘。我有一个文件列表(随机名称),我想使用一些命令来处理它们

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

我想通过使用所有处理器来加快速度。如何使这样的脚本同时占用 10 个处理器(通过处理 10 个文件)?processing_command 默认情况下不是并行的。谢谢!

4

1 回答 1

2

简单的方法是使用:

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
于 2013-06-21T09:39:28.163 回答