Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

parfeval future のクエリおよびキャンセル

parfeval または parfevalOnAll を使用してバックグラウンドで計算を実行する際には、future と呼ばれるオブジェクトを作成します。future の State プロパティを使用して、future が実行中か、待機中か、完了しているかを調べることができます。また、並列プールの FevalQueue プロパティを使用して、実行中または待機中の future にアクセスすることもできます。future をキャンセルするには、関数 cancel を使用できます。この例では、以下を行います。

  • cancel を使用して future を直接キャンセルする。

  • 完了した future について完了エラーをチェックする。

  • FevalQueue プロパティを使用して future にアクセスする。

キューへの作業の追加

2 つのワーカーをもつ並列プール p を作成します。

p = parpool(2);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 2).

parfeval を使用してバックグラウンドで計算を実行するときに、この関数は各計算について future を作成し、プールのキューに追加します。ワーカーがアイドルになるまで、タスクはキューに残ります。ワーカーがアイドルになると、キューが空でない場合はタスクの計算が開始されます。ワーカーがタスクを完了すると、タスクはキューから削除され、そのワーカーはアイドルになります。

parfeval を使用して、ワーカーに関数 pause を実行するように命令することにより、future の配列 f を作成します。3 番目の future に引数 1 を使用し、その他すべての future に引数 Inf を使用します。

for n = 1:5
    if n == 3
        f(n) = parfeval(@pause,0,1);
    else
        f(n) = parfeval(@pause,0,Inf);
    end
end

parfeval の使用ごとに、ワーカー上での関数の実行を表す future オブジェクトが返されます。3 番目の future を除く各 future は、計算に無限量の時間を要します。parfeval(@pause,0,Inf) によって作成された future は、キューを低速化する future の極端な例です。

future の直接キャンセル

State プロパティを使用して、future のステータスを取得できます。f の各 future の状態からなる cell 配列を作成します。

{f.State}
ans = 1×5 cell
    {'running'}    {'running'}    {'queued'}    {'queued'}    {'queued'}

3 番目を除く各タスクが永久に一時停止しています。

cancel を使用して、2 番目の future を直接キャンセルします。

cancel(f(2));
{f.State}
ans = 1×5 cell
    {'running'}    {'finished'}    {'running'}    {'queued'}    {'queued'}

2 番目の future をキャンセルすると、3 番目の future が実行されます。3 番目の future が完了するまで待ってから、再び状態を調べます。

wait(f(3));
{f.State}
ans = 1×5 cell
    {'running'}    {'finished'}    {'finished'}    {'running'}    {'queued'}

3 番目の future の状態は 'finished' になっています。

完了エラーのチェック

future が完了すると、その State プロパティは 'finished' になります。キャンセルされた future と正常に完了した future を区別するには、Error プロパティを使用します。

fprintf("f(2): %s\n", f(2).Error.message)
f(2): Execution of the future was cancelled.
fprintf("f(3): %s\n", f(3).Error.message)
f(3): 

message プロパティが示すように、コードは 2 番目の future をキャンセルします。message プロパティで述べられているように、2 番目の future はキャンセルされました。3 番目の future はエラーなしで完了するため、エラー メッセージはありません。

プール キュー内の future のキャンセル

FevalQueue プロパティを使用して、プール キュー内の future にアクセスできます。

p.FevalQueue
ans = 
 FevalQueue with properties: 

        Number Queued: 1
       Number Running: 2

キューには RunningFuturesQueuedFutures の 2 つのプロパティがあります。RunningFutures プロパティは、現在実行中のタスクに対応する future からなる配列です。

disp(p.FevalQueue.RunningFutures)
 1x2 FevalFuture array:
 
         ID              State  FinishDateTime  Function  Error
       --------------------------------------------------------
    1     3            running                    @pause       
    2     6            running                    @pause       

QueuedFutures プロパティは、現在待機中で実行されていないタスクに対応する future からなる配列です。

disp(p.FevalQueue.QueuedFutures)
 FevalFuture with properties: 

                   ID: 7
             Function: @pause
       CreateDateTime: 08-Mar-2021 10:03:13
        StartDateTime: 
      RunningDuration: 0 days 0h 0m 0s
                State: queued
                Error: none

1 つの future、または future の配列をキャンセルできます。QueuedFutures にあるすべての future をキャンセルします。

cancel(p.FevalQueue.QueuedFutures);
{f.State}
ans = 1×5 cell
    {'running'}    {'finished'}    {'finished'}    {'running'}    {'finished'}

RunningFutures および QueuedFutures は、f が最新から最古へという順になっているかどうかにかかわらず、最新から最古へと並べ替えられます。各 future には、クライアントの有効期間に対する一意の ID プロパティがあります。f の各 future の ID プロパティをチェックします。

disp(f)
 1x5 FevalFuture array:
 
         ID              State        FinishDateTime  Function  Error
       --------------------------------------------------------------
    1     3            running                          @pause       
    2     4  finished (unread)  08-Mar-2021 10:03:20    @pause  Error
    3     5  finished (unread)  08-Mar-2021 10:03:21    @pause       
    4     6            running                          @pause       
    5     7  finished (unread)  08-Mar-2021 10:03:22    @pause  Error

結果を、それぞれの RunningFuturesID プロパティと比較します。

for j = 1:length(p.FevalQueue.RunningFutures)
    rf = p.FevalQueue.RunningFutures(j);
    fprintf("p.FevalQueue.RunningFutures(%i): ID = %i\n", j, rf.ID)
end
p.FevalQueue.RunningFutures(1): ID = 3
p.FevalQueue.RunningFutures(2): ID = 6

ここで、RunningFuturesf(1)f(4) を含む配列です。RunningFutures(2) をキャンセルすると、4 番目の future f(4) がキャンセルされます。

場合によっては、ワークスペースで future を使用できないことがあります。たとえば、コードが完了する前に再び同じコードを実行する場合や、関数内で parfeval を使用している場合などです。ワークスペースで使用できない future はキャンセルできます。

ワークスペースから f をクリアします。

clear f

RunningFuturesQueuedFutures を使用して、未完了の future にアクセスできます。RunningFutures を使用して f(4) をキャンセルします。

rf2 = p.FevalQueue.RunningFutures(2);
cancel(rf2)
rf2.State
ans = 
'finished'

まだキュー内にあるすべての future をキャンセルするには、次のコードを使用します。

cancel(p.FevalQueue.QueuedFutures);
cancel(p.FevalQueue.RunningFutures);