afterEach
и afterAll
запускать функции обратного вызоваВы создаете Future
когда вы запускаете функции в фоновом режиме или на параллельном использовании пула parfeval
, parfevalOnAll
, afterEach
, или afterAll
. Можно использовать afterEach
и afterAll
автоматически запускать функцию обратного вызова после одного или нескольких Future
конец объектов.
Если вы используете afterEach
MATLAB® запускает функцию обратного вызова после каждого Future
объектные концы. Если Future
массив имеет M
элементы, клиент MATLAB запускает функцию обратного вызова M
\times.
Если вы используете afterEach
, MATLAB запускает функцию обратного вызова после всего Future
объектный конец. Если Future
массив имеет M
элементы, клиент MATLAB запускается, функция обратного вызова только запускается однажды.
afterEach
на parfeval
РасчетыМожно использовать afterEach
автоматически вызвать функции на каждый из результатов parfeval
расчеты.
Используйте parfeval
вычислить случайные векторы в рабочих. С настройками по умолчанию, parfeval
создает parpool
автоматически, если нет того, уже созданного.
for idx = 1:10 f(idx) = parfeval(@rand, 1, 1000, 1); end
Отобразите максимальный элемент в каждом из тех векторов после того, как они будут созданы. afterEach
выполняет указатель на функцию на выходе каждого будущего, когда они становятся готовыми.
afterEach(f, @(r) disp(max(r)), 0);
0.9975 0.9990 0.9982 0.9991 0.9982 0.9998 0.9999 0.9986 0.9996 0.9990
afterAll
на parfeval
РасчетыМожно использовать afterAll
автоматически вызвать функции на все объединенные выходные параметры вашего parfeval
расчеты.
Используйте parfeval
вычислить случайные векторы в рабочих. С настройками по умолчанию, parfeval
создает parpool
автоматически, если нет того, уже созданного.
for idx = 1:10 f(idx) = parfeval(@rand, 1, 1000, 1); end
Отобразите максимальный элемент среди всех тех векторов после того, как они будут созданы. afterAll
выполняет указатель на функцию на объединенном выходе всех фьючерсов, когда они все становятся готовыми.
afterAll(f, @(r) disp(max(r)), 0);
0.9998
afterEach
и afterAll
Можно объединить afterEach
и afterAll
автоматически вызвать больше функций на результаты фьючерсов. Оба afterEach
и afterAll
сгенерируйте будущие переменные, которые могут использоваться снова в afterEach
и afterAll
.
Используйте parfeval
вычислить случайные векторы в рабочих. С настройками по умолчанию, parfeval
создает parpool
автоматически, если нет того, уже созданного.
for idx= 1:10 f(idx) = parfeval(@rand, 1, 1000, 1); end
Starting parallel pool (parpool) using the 'local' profile ... connected to 8 workers.
Вычислите самый большой элемент в каждом из тех векторов, когда они станут готовыми. afterEach
выполняет указатель на функцию на выходе каждого будущего, когда они становятся готовыми, и создает другое будущее, чтобы содержать результаты.
maxFuture = afterEach(f, @(r) max(r), 1);
Чтобы вычислить минимальное значение среди них, вызовите afterAll
на этом новом будущем. afterAll
выполняет функцию на объединенных выходных аргументах всех фьючерсов после того, как они все завершатся. В этом случае, afterAll
выполняет функциональный min
на выходных параметрах maxFuture
после завершения и создает другое будущее, чтобы содержать результат.
minFuture = afterAll(maxFuture, @(r) min(r), 1);
Можно выбрать результат с помощью fetchOutputs
. fetchOutput
ожидает, пока будущее не завершается, чтобы собрать результаты.
fetchOutputs(minFuture)
ans = 0.9973
Можно проверять результат afterEach
путем вызова fetchOutputs
на его будущей переменной.
fetchOutputs(maxFuture)
ans = 10×1
0.9996
0.9989
0.9994
0.9973
1.0000
1.0000
0.9989
0.9994
0.9998
0.9999
afterEach
и afterAll
В этом примере показано, как обновить пользовательский интерфейс, когда расчеты завершаются. Когда вы разгружаете расчеты рабочим, использующим parfeval
, все пользовательские интерфейсы являются быстро реагирующими, в то время как рабочие выполняют эти расчеты. В этом примере вы используете waitbar
создать простой пользовательский интерфейс.
Используйте afterEach
чтобы обновить пользовательский интерфейс после, каждый расчет завершается.
Используйте afterAll
обновить пользовательский интерфейс после всех завершенных расчетов.
Используйте waitbar
создать указатель фигуры, h
. Когда вы используете afterEach
или afterAll
, waitbar
функционируйте обновляет указатель фигуры. Для получения дополнительной информации об объектах указателя, смотрите Поведение объекта Указателя.
h = waitbar(0,'Waiting...');
Используйте parfeval
вычислить действительную часть собственных значений случайных матриц. С настройками по умолчанию, parfeval
автоматически создает параллельный пул, если вы уже не создаетесь.
for idx = 1:100 f(idx) = parfeval(@(n) real(eig(randn(n))),1,5e2); end
Можно использовать afterEach
автоматически вызвать функции на каждый из результатов parfeval
расчеты. Используйте afterEach
чтобы вычислить самое большое значение в каждом из выходных массивов после, каждое будущее завершается.
maxFuture = afterEach(f,@max,1);
Можно использовать State
свойство получить состояние фьючерсов. Создайте логический массив где State
свойство фьючерсов в f
"finished"
. Используйте mean
вычислить часть законченных фьючерсов. Затем создайте анонимную функцию updateWaitbar
. Функция изменяет дробную длину панели ожидания h
к части законченных фьючерсов.
updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);
Используйте afterEach
и updateWaitbar
обновить дробную длину панели ожидания после каждого будущего в maxFuture
завершается. Используйте afterAll
и delete
чтобы закрыть панель ожидания после, все расчеты завершены.
updateWaitbarFutures = afterEach(f,updateWaitbar,0); afterAll(updateWaitbarFutures,@(~) delete(h),0);
Используйте afterAll
и histogram
показать гистограмму результатов в maxFuture
после всех завершенных фьючерсов.
showsHistogramFuture = afterAll(maxFuture,@histogram,0);
Когда расчеты для будущих переменных приводят к ошибке, по умолчанию, afterEach
не выполняет его функцию на элементах, которые перестали работать. Если вы хотите обработать какие-либо ошибки, например, у вас есть пользовательский интерфейс, который вы хотите обновить, можно использовать пару "имя-значение" PassFuture
. Когда установлено в true
, будущая переменная передается функции обратного вызова. Можно вызвать fetchOutputs
на нем обработайте выходные параметры и обработайте любые возможные ошибки.
Отправьте расчеты рабочим, использующим parfeval
. С настройками по умолчанию, parfeval
создает parpool
автоматически, если нет того, уже созданного. Если ваш parfeval
расчеты приводят к ошибке, будущим переменным погрешностям и ее Error
свойство отражает его.
errorFuture = parfeval(@(n) randn(n), 0, 0.5); wait(errorFuture); errorFuture.Error
ans = ParallelException with properties: identifier: 'MATLAB:NonIntegerInput' message: 'Size inputs must be integers.' cause: {} remotecause: {[1×1 MException]} stack: [1×1 struct]
Если вы используете afterEach
на том будущем функция обратного вызова не оценена на тех элементах в будущем что с ошибками. В коде ниже, msgbox
не выполняется потому что будущие ошибки.
afterEach(errorFuture, @() msgbox('Operation completed'), 0);
Чтобы обработать фьючерсы, которые приводят к ошибкам, используйте пару "имя-значение" PassFuture
при вызове afterEach
. Будущая переменная передается функции обратного вызова вместо своих выходных параметров. Вызовите fetchOutputs
на будущей переменной и процессе ее выходные параметры. Если будущее приводит к ошибке, fetchOutputs
выдает ошибку, которую можно зафиксировать и обработать. Следующий код показывает ошибочное диалоговое окно.
afterEach(errorFuture, @handleError, 0, 'PassFuture', true);
function handleError(f) try output = fetchOutputs(f); % Do something with the output catch errordlg('Operation failed'); end end