exponenta event banner

afterEach

Укажите функцию для вызова после каждой параллели. Будущее завершено

Описание

пример

outputFuture = afterEach(futures,funtocall,nout) автоматически оценивает funtocall на выходных аргументах каждого из элементов в futures по мере готовности. afterEach требования funtocall с nout выходные аргументы и создает outputFuture для удержания выходных данных.

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

пример

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

Примеры

свернуть все

Вы можете использовать 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

Можно комбинировать 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);

Когда вычисления для будущих переменных приводят к ошибке, по умолчанию 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

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

свернуть все

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

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

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

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

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

Пример: funtocall = @max

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

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

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

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

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

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

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

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

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

свернуть все

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

Совет

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

  • Использовать cancel о будущем, возвращенном из afterEach отменить его выполнение. При вызове afterEach в случае отмененного будущего, afterEach ведет себя так же, как если бы в будущем произошла ошибка.

См. также

| |

Представлен в R2018a