afterEach

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

Описание

пример

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 и оставьте пользовательский интерфейс быстро реагирующим. Используйте afterEach обновить пользовательский интерфейс, когда промежуточные расчеты готовы. Используйте afterAll обновить пользовательский интерфейс, когда все расчеты готовы.

Создайте простой пользовательский интерфейс с помощью waitbar.

h = waitbar(0, 'Waiting...');

Используйте parfeval выполнить длительные расчеты в рабочих, например, собственных значениях случайных матриц. Расчеты происходят асинхронно и обновления пользовательского интерфейса во время расчета. С настройками по умолчанию, parfeval создает parpool автоматически, если нет того, уже созданного.

for idx = 1:100
    f(idx) = parfeval(@(n) real(eig(randn(n))), 1, 5e2); 
end

Вычислите самое большое значение в каждом из расчетов, когда они станут готовым использованием afterEach. Обновите пропорцию законченных фьючерсов в waitbar, когда каждый из них завершит использование afterEach.

maxFuture = afterEach(f, @max, 1);
updateWaitbarFuture = afterEach(f, @(~) waitbar(sum(strcmp('finished', {f.State}))/numel(f), h), 1);

Закройте waitbar, когда все расчеты будут сделаны. Используйте afterAll на updateWaitbarFuture продолжаться автоматически операцией закрытия. afterAll получает указатель фигуры из updateWaitbarFuture и выполняет его функцию на нем.

closeWaitbarFuture = afterAll(updateWaitbarFuture, @(h) delete(h), 0);

Покажите гистограмму после того, как все максимальные значения будут вычислены. Используйте afterAll на maxFuture продолжать операцию автоматически. afterAll получает максимальные значения из maxFuture и вызовы histogram на них.

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