2011-11-25 4 views
5

私は部分的に順序付けられたタスクセットを持っています。タスクごとに、部分順序で厳密にその前にあるすべてのタスクを実行してから実行する必要があります。私は合計の実行時間を最小限にしようとするが、依存関係が完了する前にタスクを開始することなく、(前後に)関連しないタスクを同時に実行したい。Perlを使用してタスクの部分的な順序を並行して処理するにはどうすればよいですか?

タスクは(非perl)子プロセスとして実行されます。

このような問題をPerlで解決するにはどのようにすればよいですか?どの並行性制御機能とデータ構造が利用可能ですか?

+0

不正行為:依存関係を記述するためのMakefileを記述することもできます。最大4人の同時作業者に対して 'make -j 4 'を実行します。 – Dallaylaen

答えて

1

私は配列のハッシュを使用します。

$prereq{task1} = [qw/task2 task3 task4/]; 

私は異なるハッシュに完了したタスクを続けるだろう、との完全なソリューションがNP-completeであるようにそしてちょうど

my @prereq = @{ $prereq{$task} }; 
if (@prereq == grep exists $completed{$_}, @prereq) { 
    run($task); 
} 
1

はルックス:各タスクについて、そのすべてのprerequisitiesは、対応する配列に言及されます。

は部分的な解決策として、私はForks::Super::Jobは、バックグラウンドジョブを実行し、その状態をチェックして、ジョブの最大数が起動されたときにPOSIX::pauseがスリープ状態にするために、実行する準備ができていた仕事を決定するために参照カウントのいくつかのフォームを使用します。

すでに別々のプロセスを扱っているのでスレッドは関係ありません。

実行可能ジョブの優先順位を決定するために、考えられるアルゴリズム/ヒューリスティックスの最初のリンクをお読みください。

関連する問題