Parallel

説明

他の Ant タスクを入れ物となるような parallel はコンテナタスクです。 parallel タスクにネストされた個々のタスクは、各々別のスレッドで実行されます。

パラメータ

属性 説明 必須
threadCount スレッド利用の最大数 No
threadsPerProcessor プロセッサあたりに利用できるスレッドの最大数(JDK 1.4必須) No, threadCountに従う
pollInterval 現在いかなる影響もない No, デフォルトは、1000
timeout 実行終了前のミリ秒数 No
failonany もし、いくつかのネストしたタスクが失敗したら、 タスクの実行は、他のどのタスクの実行の終了を待たずに、 その時点で終了します。 No

parallel タスクは次のような場合にビルドファイル中で利用できます:

マルチスレッドを使う時には、 スレッド中のタスクが相互作用が無いよう確認するよう、注意しなければなりません。 例えば、 同じ出力先ディレクトリに出力する2 つの javac コンパイルタスクは、 一方が依存関係情報のためにクラスを読み込もうとし、 もう一つのタスクが、そのクラスファイルに書き込むというような、 相互作用するかもしれません。 <parallel>タスクにおいて、 この種の相互作用が起きないよう気をつけなければなりません。

どんな妥当なAntタスクも、他のパラレルタスクを含む、 パラレルタスク内に埋め込まれるかもしれません。

パラレルタスクの実行中に、 すべての子スレッドの終了を待って、メインスレッドはブロックされることに注意してください。 failonanyフラグがセットされ、タイムアウトかネストしたタスクの失敗によって、 実行が終了させられた場合、 パラレルタスクは、他のスレッド内で、他のネストしたタスクの完了を待たずに完了します。

<parallel>タスク内の任意のタスクが失敗し、failonanyを設定していないとき、 他のスレッド内の残ったタスクは、すべてのスレッドが完了するまで、実行し続けます。 この状況で、パラレルタスクは同様に失敗します。

parallel ブロック中で、 それぞれのスレッドで実行されるタスクの順序を定義するために、 parallel タスクは sequentialタスクと組み合わせて使うことがあるかもしれません。

threadCount属性は、 実行のための利用できるスレッドの最大数を配置するために、 使用することができます。 ない場合には、すべての子タスクは、すぐに実行されません。 ある場合には、同時に実行しているタスクの最大数は、指定されたスレッド数を超えません。 なお、それぞれのタスクは、それらが与えられる順序で始められます。 しかし、実行速度や完了順序のように、保証できません。 単に、それぞれ次の処理の前に始められます。

J2RE1.4以降を使っているなら、threadsPerProcessorと利用可能なプロセッサ数は、 プロセッサ数の定数倍になります。 (どんな特定のプロセッサにも密接な関係はありません。) バージョン1.4より前で、threadsPerProcessorが指定されたら、 現状のままでthreadCountの値が使われます。

利用しているthreadCountとthreadsPerProcessorは、 ビルドがデッドロックしないことを確認するのに注意を要します。 これは、waitForをアンロックするタスクが起こる前に、 すべての利用可能なスレッドを引き受けるwaitForのようなタスクが、 原因となりえます。 Java言語スレッドレベル意味論のための置換えではなく、 "不要なパラレル"タスクのための最もよい使い方です。

ネストする要素として指定されるパラメータ

daemons

パラレルタスクはネストした<daemons>要素をサポートします。 これは、パラレルなデーモンスレッド内で実行されるタスクのリストです。 パラレルタスクは、それらのタスクの終了を待ちません。 デーモンスレッドが存在していても、スレッドが終了するとすぐに、Antの終了から防げません。 デーモンスレッド内の失敗は、パラレルタスクが終了する前に報告されて、 パラレルが原因となる、例外をスローすることができます。 パラレルが終了後に起こる失敗はレポートされません。

例えば、Antから簡単に終えられないであろうテストサーバを開始するために、 Daemonは使うことができます。 <daemons>を使うことによって、このようなサーバーは、ビルドを止めません。

<parallel>
  <wlrun ... >
  <sequential>
    <sleep seconds="30"/>
    <junit ... >
    <wlstop/>
  </sequential>
</parallel>

この例では、 サーバーアプリケーションのテストの典型的なパターンを示しています。 一つのスレッドでサーバーを起動(wlrun タスク)し、 もう一つのスレッドには、 順序に従い実行される 3 つのタスクが入っています。 sleep タスクはサーバーが起動される時間を与えるのに使われます。 サーバーが利用可能であるか検証することができる次のタスクは、 sleep タスクに代わって使われます。 そして、一連のテストが行われます。 テストが完了したら、 両方のスレッドが完了できるように、 (この例では wlstop を使って) サーバーは停止されます。 この parallel タスクは、この時完了し、そして、 ビルドが続けられます。

<parallel>
  <javac ...> <!-- サーブレットのコンパイル -->
  <wljspc ...> <!-- JSP のプリコンパイル -->
</parallel>

この例は、 ビルド中により効率的にリソースを活用するために、 2 つの独立したタスクの実行を示したものです。 このインスタンスにおいて、 幾つかのサーブレットが一つのスレッドでコンパイルされ、 もう一つのスレッドで JSP の集合がプリコンパイルされます。 上で注意した通り、 2 つのタスクは、 依存関係において、そして、 Ant の外部の環境における相互作用の可能性において、 独立であることに注意しなければなりません。

<parallel threadCount='4'>
  <ant target='TargetThatConsumesLotsOfCPUTimeAndMemory'>
    <param name='file' value='one.txt'/>
  </ant>
  <ant target='TargetThatConsumesLotsOfCPUTimeAndMemory'>
    <param name='file' value='two.txt'/>
  </ant>
  <ant target='TargetThatConsumesLotsOfCPUTimeAndMemory'>
    <param name='file' value='three.txt'/>
  </ant>
  <!-- repeated about 40 times -->
</parallel>

この例では、 threadCountとthreadsPerProcessor属性の使用のために典型的な必要性を示しています。 40回以上これらのタスクを繰り返すと、 CPU利用時間とJVMメモリを麻痺させるかもしれません。 並列実行の数を制限することによって、無限のメモリを必要とせずに、 無限のメモリ時間を得ることができます。 これは同様に、 それぞれのタスク(この仮定ケース)が独立していて、 その他のタスクとどんな依存関係も持っていないので、 threadCount(と、threadsPerProcessor)の使用のためのよい候補です。


Copyright © 2001-2004 The Apache Software Foundation. All rights Reserved.

[訳注:これは漆島賢二の訳を参考に、横田聡が翻訳しました。日本語訳に対するコメントがあれば report@jajakarta.orgに送ってください]