cancel

Отмените поставленное в очередь или рабочее будущее

Синтаксис

Описание

пример

cancel(F) останавливает и рабочие фьючерсы с очередями, содержавшиеся в F. Никакие меры не приняты для законченных фьючерсов. Для каждого элемента F это уже не находится в 'finished' состояния, функция устанавливает свой State свойство к 'finished', и его Error свойство содержать MException указание, что выполнение было отменено.

Некоторые функции и операции не могут быть прерванными Ctrl+C, такой как save. Когда вы используете parfeval или parfevalOnAll разгружать эти функции и операции рабочему, cancel не может остановить эти фьючерсы. Чтобы остановить рабочего, выполняющего эти функции и операции, в интерактивном режиме используйте delete функционируйте, чтобы закрыть пул рабочего.

Примеры

свернуть все

Когда вы используете parfeval или parfevalOnAll чтобы запустить расчеты в фоновом режиме, вы создаете названные фьючерсы объектов. Можно использовать State свойство будущего узнать, запускается ли это, поставленный в очередь или законченный. Можно также использовать FevalQueue свойство параллельного пула к выполнению доступа и поставленным в очередь фьючерсам. Чтобы отменить фьючерсы, можно использовать cancel функция. В этом примере, вас:

  • Используйте cancel отменять фьючерсы непосредственно.

  • Проверяйте ошибки завершения на завершенных фьючерсах.

  • Используйте FevalQueue свойство получить доступ к фьючерсам.

Добавьте работу в очередь

Создайте параллельный пул p с двумя рабочими.

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

Когда вы используете parfeval чтобы запустить расчеты в фоновом режиме, функция создает и добавляет будущее для каждого расчета очереди пула. Задачи остаются в очереди, пока рабочий не становится неактивным. Когда рабочий становится неактивным, это начинает вычислять задачу, если очередь не пуста. Когда рабочий выполняет задачу, задача удалена из очереди, и рабочий становится неактивным.

Используйте parfeval создать массив фьючерсов f давая рабочим команду выполнить функциональный pause. Используйте аргумент 1 для третьего будущего и аргумента Inf для всех других фьючерсов.

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

Каждое использование parfeval возвращает будущий объект, который представляет выполнение функции на рабочем. За исключением третьего будущего, каждое будущее займет бесконечное количество времени, чтобы вычислить. Будущее создается parfeval(@pause,0,Inf) крайний случай будущего, которое может замедлить очередь.

Отмените фьючерсы непосредственно

Можно использовать State свойство получить состояние фьючерсов. Создайте массив ячеек состояния каждого будущего в f.

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

Каждая задача за исключением трети делает паузу навсегда.

Отмените второе будущее непосредственно с cancel.

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

После того, как вы отменяете второе будущее, третьи будущие запуски. Ожидайте, пока третье будущее не завершается, затем исследуйте состояния снова.

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

Третье будущее теперь имеет 'finished' состояния.

Проверяйте ошибки завершения

Когда будущее завершается, его State свойство становится 'finished'. Чтобы различать фьючерсы, которые отменяются и обычно завершаются, используйте 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 свойство. Третье будущее завершается без ошибки, и поэтому не имеет сообщения об ошибке.

Отмените фьючерсы в очереди пула

Можно использовать FevalQueue свойство получить доступ к фьючерсам в очереди пула.

p.FevalQueue
ans = 
 FevalQueue with properties: 

        Number Queued: 1
       Number Running: 2

У очереди есть два свойства: RunningFutures и QueuedFutures. RunningFutures свойство является массивом фьючерсов, соответствуя задачам, которые в настоящее время запускаются.

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

QueuedFutures свойство является массивом фьючерсов, соответствуя задачам, которые в настоящее время ставятся в очередь и не выполнение.

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

                   ID: 16
             Function: @pause
       CreateDateTime: 15-Jul-2020 17:29:37
        StartDateTime: 
     Running Duration: 0 days 0h 0m 0s
                State: queued
                Error: none

Можно отменить одно будущее или массив фьючерсов. Отмените все фьючерсы в QueuedFutures.

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

RunningFutures и QueuedFutures сортируются от самых старых до новейших, независимо от ли f в порядке от самых старых до новейших. Каждое будущее имеет уникальный ID свойство в течение времени жизни клиента. Проверяйте ID свойство каждых из фьючерсов в f.

disp(f)
 1x5 FevalFuture array:
 
         ID              State        FinishDateTime  Function  Error
       --------------------------------------------------------------
    1    12            running                          @pause       
    2    13  finished (unread)  15-Jul-2020 17:29:37    @pause  Error
    3    14  finished (unread)  15-Jul-2020 17:29:39    @pause       
    4    15            running                          @pause       
    5    16  finished (unread)  15-Jul-2020 17:29:39    @pause  Error

Сравните результат с ID свойство каждого RunningFutures.

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 = 12
p.FevalQueue.RunningFutures(2): ID = 15

Здесь, RunningFutures массив, содержащий f(1) и f(4). Если вы отменяете RunningFutures(2), вы отменяете четвертый будущий f(4).

Иногда, фьючерсы не доступны в рабочей области, например, если вы выполняете ту же часть кода дважды, прежде чем это закончится, или если вы используете parfeval в функции. Можно отменить фьючерсы, которые не доступны в рабочей области.

Очистите f из рабочей области.

clear f

Можно использовать RunningFutures и QueuedFutures к фьючерсам доступа, которые еще не завершились. Используйте RunningFutures отменять f(4).

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

Чтобы отменить все фьючерсы все еще в очереди, используйте следующий код.

cancel([p.FevalQueue.RunningFutures p.FevalQueue.QueuedFutures])

Запускайте функцию несколько раз, пока удовлетворительный результат не будет найден. В этом случае массив фьючерсов F отменяется, когда результат больше 0.95.

N = 100;
for idx = N:-1:1
    F(idx) = parfeval(@rand,1); % Create a random scalar
end
result = NaN; % No result yet.
for idx = 1:N
    [~, thisResult] = fetchNext(F);
    if thisResult > 0.95
        result = thisResult;
        % Have all the results needed, so break
        break;
    end
end
% With required result, cancel any remaining futures
cancel(F)
result

Входные параметры

свернуть все

Будущий объект, возвращенный как parallel.FevalFuture, это представляет выполнение fcn на параллельном рабочем и содержит его результаты. Использование fetchOutputs или fetchNext собрать результаты.

Смотрите также

| | | | | |

Введенный в R2013b