exponenta event banner

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 функция обновляет дескриптор фигуры. Дополнительные сведения об объектах-дескрипторах см. в разделе Поведение объектов-дескрипторов.

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