2011-07-05 22 views
7

私はスクリプト(コマンドの線形リスト)を持っています。これは、連続して実行するのに時間がかかります。私は、任意の線形スクリプトからコマンドを読んだり、設定可能な数の並列作業者にそれらを送り出すことができるユーティリティスクリプト(Perl、Bash、またはCygwinで利用可能な他のもの)を作成したいと考えています。PerlまたはBashスレッドプールスクリプト?

myscript

command1 
command2 
command3 

であれば、私は実行することができます。

threadpool -n 2 myscript 

2つのスレッドは、command1およびその他のcommand2で始まるものを作成することでしょう。どちらのスレッドが最初にジョブを終了しても、最初にcommand3を実行します。

Perlに潜入する前に(これは長い時間がかかりました)、私は専門家にこのようなものが既に存在するかどうか尋ねるべきだと考えました。マルチCPUマシンの利用と並列ネットワーク転送(wgetまたはscp)の両方に非常に役立つので、このようなものがあるはずです。私は正しい検索条件を知らないと思う。ありがとう!

+0

これはいかがですか? http://www.rootninja.com/use-multiple-processors-in-bash-by-running-commands-in-parallel/ – carlpett

+0

@ carlpettはい、答えがあります。 - xargs -P'ありがとうございます。 – paperjam

+0

関連性が高い:http://stackoverflow.com/questions/4539310/does-a-modified-command-invocation-toolwhich-dynamically-regulates-a-job-pool(xargsは、多くのツールでうまくいきません(例:unzip) – daxim

答えて

3

Perlでは、あなたがParallel::ForkManagerでこれを行うことができます。

#!/usr/bin/perl 

use strict; 
use warnings; 
use Parallel::ForkManager; 
my $pm = Parallel::ForkManager->new(8); # number of jobs to run in parallel 

open FILE, "<commands.txt" or die $!; 
while (my $cmd = <FILE>) { 
    $pm->start and next; 
    system($cmd); 
    $pm->finish; 
} 
close FILE or die $!; 

$pm->wait_all_children; 
+0

Perlのバージョンが必要ですか? – sehe

0

またmakeを使用することができます。

parallel -j2 ::: command1 command2 command3 

た場合、または:Hereは、あなたが(xargs -Pリスクがやっている)混同してはならない出力が必要な場合は、あなたがGNUのパラレルを使用することができます創造

+0

この場合、sconsはもっと汎用的なアプローチになります(そして少し難解です) – sehe

+1

リンクは壊れていますが、ウェイバックマシンでも利用できます。http://web.archive.org/web/20120509141639/http:// teddziuba.com/2011/02/stupid-unix-tricks-workflow-control-with-gnu-make.html – Quantum7

4

それを使用する方法について非常に興味深い記事ですコマンドは、ファイルに格納されています

cat file | parallel -j2 

GNUパラレルは、一般的な並列化であり、あなたはへのsshアクセスを持って、同じマシンまたは複数のマシン上で並行してジョブを実行することは容易であることができます。あなたは4つのCPU上で実行したい32種類のジョブを持っている場合

、並列化する単純な方法は、各CPUの8つのジョブを実行することです:

Simple scheduling

GNUパラレルを代わりにするときに、新しいプロセスを生成します1つの仕上げ - アクティブなCPUを維持するため、時間を節約:

GNU Parallel scheduling

インストール

配布用にGNU Parallelがパッケージ化されていない場合は、rootでのアクセスが不要な個人用インストールを行うことができます。それは、これを行うことにより、10秒で行うことができますhttp://www.gnu.org/software/parallel/man.html

は、イントロビデオを見る:その他のインストールオプションについては

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

が見http://git.savannah.gnu.org/cgit/parallel.git/tree/README

は、より多くの例を参照してください詳細をご覧くださいhttps://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

ウォークスルーt彼はチュートリアル:https://lists.gnu.org/mailman/listinfo/parallel

関連する問題