このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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
キューには RunningFutures
と QueuedFutures
の 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
結果を、それぞれの RunningFutures
の ID
プロパティと比較します。
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
ここで、RunningFutures
は f(1)
と f(4)
を含む配列です。RunningFutures(2)
をキャンセルすると、4 番目の future f(4)
がキャンセルされます。
場合によっては、ワークスペースで future を使用できないことがあります。たとえば、コードが完了する前に再び同じコードを実行する場合や、関数内で parfeval
を使用している場合などです。ワークスペースで使用できない future はキャンセルできます。
ワークスペースから f
をクリアします。
clear f
RunningFutures
と QueuedFutures
を使用して、未完了の future にアクセスできます。RunningFutures
を使用して f(4)
をキャンセルします。
rf2 = p.FevalQueue.RunningFutures(2); cancel(rf2) rf2.State
ans = 'finished'
まだキュー内にあるすべての future をキャンセルするには、次のコードを使用します。
cancel(p.FevalQueue.QueuedFutures); cancel(p.FevalQueue.RunningFutures);