文档

afterEach

指定要在每次并行之后调用的函数。将来完成

描述

例子

outputFuture= afterEach (期货funtocallnout自动评估funtocall中的每个元素的输出参数期货当他们准备好了。afterEach调用funtocallnout输出参数并产生outputFuture保存输出。

以下是一个有用的应用程序afterEach是否在并行计算期间更新用户界面,如绘图和应用程序parfeval.例如,您可以向使用parfeval当每一个完成使用时更新你的用户界面afterEach

例子

outputFuture= afterEach (期货funtocallnout“PassFuture”,passFuture行为相同,如果passFuture.如果passFuture真正的afterEach调用funtocall中的每个元素期货,而不是它们的输出参数。这即使发生在元素期货遇到错误。

例子

全部折叠

你可以用afterEach的每个结果上自动调用函数parfeval计算。

使用parfeval计算工人中的随机向量。在默认首选项下,parfeval创建一个parpool如果没有创建,则自动。

Idx = 1:10 f(Idx) = parfeval(@rand, 1,1,000, 1);结束

在这些向量被创建之后,显示它们中的最大元素。afterEach在每个future的输出准备就绪时,执行它们的函数句柄。

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而且毕竟对期货的结果自动调用更多的函数。这两个afterEach而且毕竟生成可以在中再次使用的未来变量afterEach而且毕竟

使用parfeval计算工人中的随机向量。在默认首选项下,parfeval创建一个parpool如果没有创建,则自动。

Idx = 1:10 f(Idx) = parfeval(@rand, 1,1,000, 1);结束
使用“本地”配置文件启动并行池(parpool)…连接8个工人。

当这些向量准备好时,计算它们中最大的元素。afterEach在每个future的输出准备就绪时,对它们执行函数句柄,并创建另一个future来保存结果。

maxFuture = afterEach(f, @(r) max(r), 1);

要计算其中的最小值,调用毕竟在这个新的未来。毕竟在所有期货完成后,对它们的组合输出参数执行一个函数。在这种情况下,毕竟执行函数最小值的输出maxFuture并创建另一个future来保存结果。

minFuture = afterAll(maxFuture, @(r) min(r), 1);

您可以使用fetchOutputs。fetchOutput等待未来完成收集结果。

fetchOutputs (minFuture)
Ans = 0.9973

你可以检查的结果afterEach通过调用fetchOutputs它的未来变量。

fetchOutputs (maxFuture)
ans =10×10.9996 0.9989 0.9994 0.9973 1.0000 1.0000 0.9989 0.9994 0.9998 0.9999

您可以在使用的工作者上执行异步计算parfeval保持用户界面的响应性。使用afterEach在中间计算准备就绪时更新用户界面。使用毕竟当所有计算准备就绪时,更新用户界面。

创建一个简单的用户界面waitbar

H = waitbar(0,“等……”);

使用parfeval在工体中进行耗时的计算,例如,随机矩阵的特征值。计算是异步进行的,并且在计算期间更新用户界面。在默认首选项下,parfeval创建一个parpool如果没有创建,则自动。

Idx = 1:100 f(Idx) = parfeval(@(n) real(eig(randn(n))), 1,5e2);结束

在每个计算中,当它们准备使用时,计算最大的值afterEach.当每个期货完成使用时,更新等待栏中已完成期货的比例afterEach

maxFuture = afterEach(f, @max, 1);updateWaitbarFuture = afterEach(f, @(~) waitbar(sum(strcmp()“完成”, {f. state}))/numel(f), h), 1);

当所有的计算都完成时,关闭等待栏。使用毕竟updateWaitbarFuture用关闭操作自动继续。毕竟获取图形句柄updateWaitbarFuture并在上面执行它的功能。

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

显示一个直方图后,所有的最大值计算。使用毕竟maxFuture自动继续操作。毕竟获取最大值maxFuture并调用柱状图在他们身上。

showsHistogramFuture = afterAll(maxFuture, @histogram, 0);

默认情况下,当对未来变量的计算导致错误时,afterEach不会对失败的元素求函数值。如果您想处理任何错误,例如,您有一个想要更新的用户界面,您可以使用名称-值对PassFuture.当设置为真正的, future变量被传递给回调函数。你可以打电话fetchOutputs在它上,处理输出,并处理任何可能的错误。

将计算结果发送给使用parfeval.在默认首选项下,parfeval创建一个parpool如果没有创建,则自动。如果你的parfeval计算结果会产生一个错误,即未来变量的错误错误房地产反映了这一点。

errorFuture = parfeval(@(n) randn(n), 0, 0.5);等待(errorFuture);errorFuture。错误
ans = ParallelException带有属性:identifier: 'MATLAB:NonIntegerInput'消息:'大小输入必须是整数。' cause: {} remotecause: {[1×1 MException]} stack: [1×1 struct]

如果你使用afterEach在那个future中,回调函数不会在那些future中出错的元素上求值。在下面的代码中对话框因为将来的错误而不执行。

afterEach(errorFuture, @()“操作完成”), 0);

要处理导致错误的期货,请使用名称-值对PassFuture当调用afterEach.future变量被传递给回调函数,而不是它的输出。调用fetchOutputs对未来变量,并处理其输出。如果未来的结果是一个错误,fetchOutputs抛出您可以捕获和处理的错误。以下代码显示了一个错误对话框。

afterEach(errorFuture, @handleError, 0,“PassFuture”,真正的);

函数handleError (f)试一试output = fetchOutputs(f);%对输出做一些事情errordlg (“操作失败”);结束结束

输入参数

全部折叠

的数组指定的期货平行的。未来funtocall在每个元素就绪时对它们进行调用。你可以用parfeval创造未来。

的元素期货遇到一个错误,funtocall的元素没有求值期货的其他元素期货不遇到错误。要查看是否有任何带有错误的期货,可以检查错误的属性outputFuture.如果没有错误,此属性是一个空单元格数组。如果有错误,则它是一个包含与未来相同数量单元格的单元格数组期货.的对应元素,则单元格包含错误期货遇到错误,否则为空。如果你消去一个元素期货,这会导致与元素遇到错误相同的行为。

例子:Future = parfeval(@rand, 1,1,000,1);afterEach(未来@max 1);

数据类型:平行的。未来

函数执行,指定为调用其中每个期货的输出参数的函数期货当他们准备好了。funtocall在MATLAB®客户端和不上平行池的工人。

例子:Funtocall = @max

数据类型:函数处理

期望的输出数,指定为整数funtocall

例子:afterEach(期货、@max、1)

数据类型:标量

指示符,指定为一个逻辑标量,用于确定输入参数的类型funtocall.如果设置为真正的,每个未来都在期货传递给funtocall.否则,每个future in的输出参数期货传递给funtocall.这个参数是可选的默认情况下。

如果想处理任何错误,可以使用这种方法。集passFuture真正的afterEach调用funtocall中的每个元素期货即使他们遇到了错误。你必须打电话fetchOutputs的输入参数funtocall提取结果。如果有错误的期货,fetchOutputs抛出您可以捕获和处理的错误。

例子:afterEach(期货、@ (f) disp (fetchOutputs (f)), 0, PassFuture,真的)

数据类型:逻辑标量

输出参数

全部折叠

未来,归为一平行的。未来保存评估结果funtocall每一个期货期货当他们准备好了。要提取结果,请调用fetchOutputsoutputFuture

提示

  • 使用afterEach任何一个未来的人parfevalparfevalOnAll毕竟afterEach,或者一个包含它们组合的数组。例如,使用afterEach对另一个函数的结果自动调用更多函数毕竟afterEach.你可以调用afterEach期货交割前后的交易。

  • 使用取消从一个未来返回afterEach取消其执行。如果你调用afterEach在被取消的未来,afterEach行为方式与未来发生错误相同。

在R2018a中介绍