Skip to main content

作業キュー・マネージャの使用

ここでは、%SYSTEM.WorkMgrOpens in a new tab について具体的に説明します。クラス・リファレンスの "%SYSTEM.ShardWorkMgrOpens in a new tab" も参照してください。両方のクラスで同じ API が使用されます。

作業キュー・マネージャを使用して並列処理を実行するには、以下の手順を実行します。

  1. 並列処理する ObjectScript コードを特定します。"コード要件" を参照してください。

  2. コードを作業単位に分割します。

  3. 作業キューを作成します。これは %SYSTEM.WorkMgrOpens in a new tab クラスのインスタンスです。そのためには、%SYSTEM.WorkMgrOpens in a new tab クラスの %New() メソッドを呼び出します。このメソッドは作業キューを返します。

    使用する並列ワーカ・ジョブの数を指定することも、既定値を使用することもできます。既定値はマシンとオペレーティング・システムによって異なります。さらに、カテゴリを作成済みの場合は、ジョブの取得元のカテゴリを指定できます。

    作業キューを作成すると、作業キュー・マネージャは以下のアーティファクトを作成します。

    • 作業キューが実行されるネームスペース名など、作業キューについての情報を含むグローバル

    • 作業キューが処理する必要のある、シリアライズされた作業単位の場所とイベント・キュー

    • 作業キューが作業単位の処理を終了したときに作成される完了イベントの場所とイベント・キュー

  4. 作業単位 (作業項目とも呼ばれる) を作業キューに追加します。このためには、Queue() メソッドまたは QueueCallback() メソッドを呼び出すことができます。引数として、クラス・メソッド (またはサブルーチン) の名前と、対応する引数があれば渡します。

    キューに追加された項目に対してすぐに処理が開始されます。

    キューで利用可能なワーカ・ジョブよりもキュー内の項目が多い場合、キューを空にするためにジョブの競合が発生します。例えば、100 個の項目と 4 つのジョブがある場合、各ジョブはキューの先頭から項目を取り出して処理してから、キューの先頭に戻り、別の項目を取り出して処理します。キューが空になるまで、このパターンが続きます。

    作業キュー・マネージャは、作業項目の実行時に、呼び出し元のセキュリティ・コンテキストを使用します。

    作業項目をキューに入れると、作業キュー・マネージャは以下のタスクを実行します。

    • 作業単位を構成する引数、セキュリティ・コンテキスト、およびクラス・メソッドまたはサブルーチンをシリアライズしてから、シリアライズされたデータを、作業キューに関連付けられた作業単位をリストするグローバルに挿入する。

    • 作業キュー上のイベントを通知する。

    • 作業単位を処理するために追加のワーカ・ジョブが必要な場合に、ワーカ・ジョブが利用可能であれば、ワーカ・ジョブが作業キューにアタッチされるようにし、利用可能なワーカ・ジョブの数を減らす。

  5. 作業が完了するまで待機します。そのために、作業キューの WaitForComplete() メソッドを呼び出すことができます。

    次に、作業キュー・マネージャは以下のタスクを実行します。

    • 完了イベントを待機する

    • ワークロード・メトリックなどの出力をターミナルに表示する

    • 作業単位に関連するエラーがあれば収集する

    • QueueCallback() メソッドを使用して作業単位を作業キューに追加した場合は、コールバック・コードを実行する

  6. アプリケーションに応じた処理を続行します。

以下の例では、これらの基本的な手順を示しています。

    Set queue=##class(%SYSTEM.WorkMgr).%New() 
    For i = 1:1:filelist.Count() {
        Set sc=queue.Queue("..Load",filelist.GetAt(i))
        If $$$ISERR(sc) { 
            Return sc
        }
    }
    Set sc=queue.WaitForComplete()
    If $$$ISERR(sc) { 
        Return sc
    }

コードで作業キュー・マネージャを初期化してから、ファイルのリストを繰り返し処理します。各ファイルに対して、ファイルを読み込む作業キュー項目を追加します。すべての作業キュー項目を追加したら、作業が完了するまでコードで待機します。

Note:

%SYSTEM.WorkMgrOpens in a new tab クラスは、他のトピックで説明しているメソッドで、より複雑なワークフローをサポートします。

作業キューを作成するためのメソッド

作業キューを作成し、項目を追加して、完了を確認するには、%SYSTEM.WorkMgrOpens in a new tab クラスの以下のメソッドを使用します。

%New()
classmethod %New(qspec As %String = "", numberjobs As %Integer, category) as WorkMgr

作業キュー (並列処理の実行に使用できる %SYSTEM.WorkMgrOpens in a new tab クラスのインスタンス) を作成し、初期化して返します。このメソッドは、以下の引数を受け入れます。

qspec

この作業キュー内で実行されるコードを制御するコンパイラ・フラグと修飾子の文字列。"フラグおよび修飾子" を参照してください。

numberjobs

この作業キュー内で使用する並列ワーカ・ジョブの最大数です。既定値は、マシンとオペレーティング・システムの特性によって異なります。

category

この作業キュー内で使用するワーカ・ジョブを供給するカテゴリの名前です。詳細は、"カテゴリの管理" を参照してください。

作成時にキューにワーカ・ジョブが割り当てられることはありません。ワーカ・ジョブは、作業単位を作業キューに追加した後にのみ割り当てられます。

Queue()
method Queue(work As %String, args... As %String) as %Status

作業単位を作業キューに追加します。このメソッドは、以下の引数を受け入れます。

work

実行するコードです。一般的に、このコードは、成功または失敗を示す %StatusOpens in a new tab 値を返します。

コードが %StatusOpens in a new tab 値を返す場合、以下の構文を使用できます。

  • クラス・メソッドには ##class(Classname).ClassMethod を使用します。Classname はクラスの完全修飾名、ClassMethod はメソッドの名前です。

    メソッドが同じクラスにある場合、例に示すように、構文 ..ClassMethod を使用できます。

  • サブルーチンには $$entry^rtn を使用します。entry はサブルーチンの名前、rtn はルーチンの名前です。

コードが %StatusOpens in a new tab 値を返さない場合は、代わりに以下の構文を使用します。

  • クラス・メソッドには =##class(Classname).ClassMethod (または、メソッドが同じクラス内にある場合は =..ClassMethod) を使用します。

  • サブルーチンには entry^rtn を使用します。

作業単位の要件に関する情報については、"作業単位について" を参照してください。

args

クラス・メソッドまたはサブルーチンの引数のコンマ区切りリストです。多次元配列を引数として渡すには、通常どおりその引数の前にピリオドを付けて、参照によって渡されるようにします。

このフレームワークを最大限に活用するには、これらの引数で渡されるデータのサイズを比較的小さくする必要があります。大量の情報を渡すには、引数の代わりにグローバルを使用します。

作業単位をキューに入れると、作業キューの作成時に指定した numberjobs の値または既定値まで、一度に 1 つずつジョブが割り当てられます。また、呼び出し元のセキュリティ・コンテキストが記録され、各作業項目はそのセキュリティ・コンテキスト内で実行されます。

WaitForComplete()
method WaitForComplete(qspec As %String, errorlog As %String) as %Status

作業キューがすべての項目を完了するまで待機してから、成功または失敗を示す %StatusOpens in a new tab 値を返します。%StatusOpens in a new tab 値には、作業項目によって返されるすべての %StatusOpens in a new tab 値の情報が含まれます。このメソッドは、以下の引数を受け入れます。

qspec

コンパイラ・フラグと修飾子の文字列です。"Compiler Flags and Qualifiers" を参照してください。

errorlog

エラー情報の文字列で、出力として返されます。

作業キューのプロパティ

各作業キュー (または %SYSTEM.WorkMgrOpens in a new tab のインスタンス) には、以下のプロパティがあります。

NumWorkers

作業キューに割り当てられたワーカ・ジョブの数です。

NumActiveWorkers

現在アクティブなワーカの数です。

情報を返す

作業単位は、(ステータス以外の) 情報を返すことができます。これは特に、親プロセスとの通信が単純ではない可能性があるシャード・キュー・マネージャの状況で有用です。これを行うため、作業単位はパブリックの %result 多次元配列に書き込むことができます。呼び出し元は、次の 2 つの方法のいずれかでこの配列にアクセスできます。

  • この配列は WaitOne() メソッドで参照によって返されます。

  • 変数 %resultQueueCallback() メソッド内で使用できます。

FeedbackOpens in a new tab