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);