Отмените поставленное в очередь или рабочее будущее
cancel(
останавливает и рабочие фьючерсы с очередями, содержавшиеся в F
)F
. Никакие меры не приняты для законченных фьючерсов. Для каждого элемента F
это уже не находится в 'finished'
состояния, функция устанавливает свой
State
свойство к 'finished'
, и его Error
свойство содержать MException
указание, что выполнение было отменено.
Некоторые функции и операции не могут быть прерванными Ctrl+C, такой как save
. Когда вы используете parfeval
или parfevalOnAll
разгружать эти функции и операции рабочему, cancel
не может остановить эти фьючерсы. Чтобы остановить рабочего, выполняющего эти функции и операции, в интерактивном режиме используйте delete
функционируйте, чтобы закрыть пул рабочего.
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 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
F
— Будущееparallel.FevalFuture
Будущий объект, возвращенный как parallel.FevalFuture
, это представляет выполнение fcn
на параллельном рабочем и содержит его результаты. Использование fetchOutputs
или fetchNext
собрать результаты.
afterAll
| afterEach
| fetchNext
| fetchOutputs
| isequal
| parfeval
| parfevalOnAll
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.