Использование afterEach и afterAll запускать функции обратного вызова

Вы создаете Future когда вы запускаете функции в фоновом режиме или на параллельном использовании пула parfeval, parfevalOnAll, afterEach, или afterAll. Можно использовать afterEach и afterAll автоматически запускать функцию обратного вызова после одного или нескольких Future конец объектов.

  • Если вы используете afterEachMATLAB® запускает функцию обратного вызова после каждого 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