afterAll

Задайте функцию, которая будет активирована после всех параллельных. Фьючерсы завершены

Описание

пример

outputFuture = afterAll(futures,funtocall,nout) автоматически оценивает funtocall о выходных аргументах всех фьючерсов в futures когда все они завершены, и возвращается outputFuture для удержания результата. afterAll оценивает funtocall о вертикальной конкатенации выходных аргументов всех фьючерсов. Если количество выходных аргументов элементов в фьючерсах отличается, afterAll использует минимум и игнорирует конечные выходные аргументы. afterAll вызывает funtocall с nout выходные аргументы.

Полезное приложение для afterAll является обновлением пользовательских интерфейсов, таких как графики и приложения во время параллельных расчетов с помощью parfeval. Для примера можно отправить несколько расчеты работникам, используя parfeval и обновляйте свой пользовательский интерфейс, когда все они закончат использовать afterAll.

пример

outputFuture = afterAll(futures,funtocall,nout,'PassFuture',passFuture) ведет себя так же, если passFuture является false. Если passFuture является true, afterAll вызывает funtocall на массиве фьючерсов futures а не на их выходных аргументах. Это происходит, даже если элементы futures обнаружены ошибки.

Примеры

свернуть все

Можно использовать 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.

Использование 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

В этом примере показано, как обновить пользовательский интерфейс по мере завершения расчетов. Когда вы разгружаете расчеты рабочим, использующим parfevalвсе пользовательские интерфейсы являются быстрыми, в то время как работники выполняют эти расчеты. В этом примере вы используете waitbar для создания простого пользовательского интерфейса.

  • Использование afterEach обновлять пользовательский интерфейс после завершения каждого расчета.

  • Использование afterAll обновить пользовательский интерфейс после завершения расчетов.

Использование waitbar чтобы создать указатель на рисунок, h. Когда вы используете afterEach или afterAll, а waitbar функция обновляет указатель на рисунок. Для получения дополнительной информации об указателе объектов смотрите Указатель Объекта Behavior.

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

Когда расчеты для будущих переменных приводят к ошибке, по умолчанию afterAll не оценивает его функцию. Если вы хотите обработать любые ошибки, например, у вас есть пользовательский интерфейс, который вы хотите обновить, можно использовать пару "имя-значение" PassFuture. Когда установлено значение trueбудущая переменная передается в функцию обратного вызова. Можно вызвать fetchOutputs на нем обрабатывайте выходы и обрабатывайте любые возможные ошибки.

Отправляйте расчеты рабочим, использующим parfeval. С настройками по умолчанию parfeval создает parpool автоматически, если он уже не создан. Если ваш parfeval расчеты приводят к ошибке, будущим ошибкам переменных и их Error свойство отражает его.

errorFuture = parfeval( @(n) randn(n), 0, 0.5);
Starting parallel pool (parpool) using the 'Local' profile ...
connected to 4 workers.
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]

Если вы используете afterAll в этом будущем функция обратного вызова не оценивается. В коде ниже, msgbox не выполняется, поскольку будущие ошибки.

afterAll(errorFuture, @() msgbox('Operation completed'), 0);

Чтобы обработать фьючерсы, которые приводят к ошибке, используйте пару "имя-значение" PassFuture при вызове afterAll. Будущая переменная передается в функцию обратного вызова вместо ее выходов. Функции fetchOutputs и обрабатывать его выходы. Если будущее приводит к ошибке, fetchOutputs выдает ошибку, которую можно поймать и обработать. Для примера следующий код показывает диалоговое окно ошибки.

afterAll(errorFuture, @handleError, 0, 'PassFuture',true);

function handleError (f)
try
    output = fetchOutputs(f);
    % Do something with the output
catch
    errordlg('Operation failed');
end
end

Входные параметры

свернуть все

Фьючерсы, заданные как массив parallel.Future. funtocall вызывается на объединенных выходах всех его элементов, когда все они становятся готовыми. Вы можете использовать parfeval для создания фьючерсов.

Если какой-либо элемент futures встречается с ошибкой, funtocall не вызывается, и outputFuture завершается с ошибкой. Чтобы увидеть, завершится ли будущее с ошибкой, можно проверить Error свойство outputFuture. Если вы отменяете элемент futuresэто приводит к тому же поведению, как если бы элемент столкнулся с ошибкой.

Пример: future = parfeval(@rand,1,1000,1); afterAll(future,@max,1);

Типы данных: parallel.Future

Функция для выполнения, заданная как функция для вызова комбинированных выходных аргументов всех фьючерсов в futures когда все они станут готовы. funtocall оценивается на MATLAB® клиент, а не работники параллельного пула.

Пример: funtocall = @max

Типы данных: function handle

Количество выходов, заданное в виде целого числа, ожидаемое от funtocall.

Пример: afterAll(futures,@max,1)

Типы данных: scalar

Индикатор, заданный как логический скаляр, который определяет тип входных параметров к funtocall. Если установлено значение true, будущий массив futures передается в funtocall. В противном случае выходные аргументы всех фьючерсов в futures передаются в funtocall. Этот аргумент является необязательным и false по умолчанию.

Вы можете использовать этот подход, если хотите обработать любые ошибки. Задайте passFuture на true так что afterAll вызывает funtocall на выходах futures, даже если они столкнулись с ошибками. Вы должны позвонить fetchOutputs от входного параметра к funtocall для извлечения результатов. Если будущее приводит к ошибке, fetchOutputs выдает ошибку, которую можно поймать и обработать.

Пример: afterAll(futures,@(f) disp(fetchOutputs(f)),0,'PassFuture',true)

Типы данных: logical scalar

Выходные аргументы

свернуть все

Будущее, вернувшееся как parallel.Future проведение результатов оценки funtocall на комбинированных выходных аргументах всех фьючерсов в futures когда все они станут готовы.

Чтобы извлечь результаты, вызовите fetchOutputs на outputFuture:

outputFutures = afterAll(futures,funtocall,nout);
[out1,out2,...,outM] = fetchOutputs(outputFutures);
Обратите внимание, что это эквивалентно вызову funtocall после выборки выходов в futures, за исключением того, что afterAll автоматически вызывает funtocall когда все элементы в futures завершено:
[tmp1,tmp2,...,tmpN] = fetchOutputs(futures);
[out1,out2,...,outM] = funtocall(tmp1,tmp2,...tmpN)
N - количество выходов от futures и M - количество выходов, заданное в afterAll с входным параметром nout.

Совет

  • Использовать afterAll на любом из фьючерсов, возвращенных из parfeval, parfevalOnAll, afterEach, afterAllили массив, содержащий их комбинацию. Для примера используйте afterAll для автоматического вызова большего количества функций в результатах другого afterEach или afterAll. Вы можете вызвать afterAll на фьючерсах до и после их окончания.

  • Использовать cancel о будущем, возвращенном из afterAll для отмены его выполнения. Если вы вызываете afterAll в отмененном будущем это приводит к тому же поведению, как если бы будущее столкнулось с ошибкой.

См. также

| |

Введенный в R2018a