Отмена постановки в очередь или выполнение будущего
cancel(
останавливает поставленные в очередь и работающие фьючерсы, содержащиеся в F
)F
. Никаких действий для готовых фьючерсов не предпринимается. Для каждого элемента F
который еще не находится в состоянии 'finished'
, функция устанавливает свои State
свойство к 'finished'
, и его Error
свойство, содержащее MException
указывает, что выполнение было отменено.
Некоторые функции и операции не могут быть прерваны Ctrl + C, например save
. Когда вы используете parfeval
или parfevalOnAll
чтобы разгрузить эти функции и операции рабочему, cancel
не может остановить эти фьючерсы. Чтобы остановить работника, выполняющего эти функции и операции, в интерактивном режиме используйте delete
функция для завершения работы пула рабочих.
parfeval
ФьючерсыКогда вы используете parfeval
или parfevalOnAll
чтобы запустить расчеты в фоновом режиме, вы создаете объекты под названием futures. Можно использовать 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
. The RunningFutures
свойство является массивом фьючерсов, соответствующих текущим задачам.
disp(p.FevalQueue.RunningFutures)
1x2 FevalFuture array: ID State FinishDateTime Function Error -------------------------------------------------------- 1 12 running @pause 2 15 running @pause
The 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.