Perlを使用してタスクの部分的な順序を並行して処理するにはどうすればよいですか?

部分的に順序付けられた一連のタスクがあります。各タスクでは、部分的な順序で厳密にその前に実行されているすべてのタスクを実行してから実行する必要があります。私は合計の実行時間を最小限にしようとするが、依存関係が完了する前にタスクを開始することなく、(前後に)関連しないタスクを同時に実行したい。

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

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

5
不正行為:依存関係を記述するためのMakefileを書くこともできます。 make -j は、最大4人の並行作業者を対象としています。
追加された 著者 Dallaylaen,

2 答え

完全な解決策のように見えるのは、 NP完了です。

部分的な解決策として、実行する準備が整っているジョブを判断するために参照カウントを使用します。 Forks :: Super :: Job を実行してバックグラウンドジョブを実行し、ステータスを確認してください。 POSIX :: pause を実行します。

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

実行可能なジョブの優先順位を決定するための可能なアルゴリズム/ヒューリスティックスの最初のリンクを読んでください。

1
追加された

私は配列のハッシュを使用します。各タスクでは、すべての前提条件が対応する配列に記述されます。

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

私は、完了したタスクを別のハッシュで保存してから、ちょうど

my @prereq = @{ $prereq{$task} };
if (@prereq == grep exists $completed{$_}, @prereq) {
    run($task);
}
1
追加された