скрипт для отправки десяти заданий и ожидания завершения и повторной отправки следующих десяти процессов? - PullRequest
1 голос
/ 12 октября 2011

Как мне нужно отправить много заданий параллельно (скажем, по десять штук в каждой), подождать, пока они завершатся, а затем повторно отправить следующие десять, и так далее?

array=( $(ls -1 window/*realign_win*.txt ) ) ;
echo ${#array[@]};

#for e in ${!array[*]}
for (( e=0; e<="${#array[@]}"; e++ ))
 do
#   echo "$e" ;
   for n in {0..9}
    do

      if [[ $e -gt ${#array[@]} ]]
         then
      echo $e, ${#array[*]};
          break;
      else

      echo $e, ${#array[*]};

    j=$(($e+$n)) ;
       echo "didel-1.01-linux-64bit --analysis indels --doDiploid --bamFile $i --ref Homo_sapiens.GRCh37.62.fa --varFile ${array[$j]}  --libFile ${i}_didel_output.libraries.txt --outputFile ${array[$j]}.didel_stage3" ;
    #e=$(($e+1)) ;
      echo $e;
      fi
      done &

wait

     done

 done

Пожалуйста, дайте предложения, чтобы он заработал, заранее спасибо

Ответы [ 2 ]

4 голосов
/ 12 октября 2011

Parallel :: ForkManager можно использовать для распараллеливания работы в Perl, и вам будет сказано ограничить максимальное количество одновременных работников.

use Parallel::ForkManager qw( );

use constant MAX_WORKERS => 10;

my $pm = Parallel::ForkManager->($MAX_PROCESSES);
for my $item (@work) {
   my $pid = $pm->start() and next;

   ...

   $pm->finish();
}

потоков и вилки обеспечивает альтернативный интерфейс. Выбор модулей влияет на то, используются ли потоки или дочерние процессы.

use threads;  # or: use forks;
use Thread::Queue qw( );

use constant MAX_WORKERS => 10;

my $q = Thread::Queue->new();

my @threads;
for (1..MAX_WORKERS) {
   push @threads, async {
      while (my $item = $q->dequeue()) {
         ...
      }
   };
}

$q->enqueue(@work);
$q->enqueue(undef) for 1..@threads;
$_->join() for @threads;
3 голосов
/ 12 октября 2011

Все еще использую скрипт оболочки, что-то вроде этого.

#!/bin/sh

jobs=`jot 25`
echo $jobs

set -- $jobs
while [ $# -gt 1 ]; do
    pids=""
    for i in `jot 10`; do
        [ $# == 0 ] && break
        job=$1
        shift

        echo start $job && sleep 3 && echo finish $job &
        pids="$pids $!"
    done
    wait $pids
done

echo done

РЕДАКТИРОВАТЬ Изменить continue на break.Спасибо @ glennjackman

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...