Запросите и отмените parfeval Фьючерсы

Когда вы используете 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     3            running                    @pause       
    2     6            running                    @pause       

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

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

Можно отменить одно будущее или массив фьючерсов. Отмените все фьючерсы в 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     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

Сравните результат с 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 = 3
p.FevalQueue.RunningFutures(2): ID = 6

Здесь, 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.QueuedFutures);
cancel(p.FevalQueue.RunningFutures);