主要内容

使用afterEach而且毕竟运行回调函数

您创建一个未来当您在后台运行函数或在并行池上使用parfevalparfevalOnAllafterEach,或毕竟.您可以使用afterEach而且毕竟在一个或多个回调函数之后自动运行未来对象完成。

  • 如果你使用afterEach, MATLAB®在每个之后运行回调函数未来对象完成。如果未来数组元素,MATLAB客户端运行回调函数次了。

  • 如果你使用afterEach, MATLAB终究运行回调函数未来对象完成。如果未来数组元素,MATLAB客户端运行回调函数只运行一次。

调用afterEachparfeval计算

您可以使用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

调用毕竟parfeval计算

您可以使用毕竟的所有组合输出上自动调用函数parfeval计算。

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

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

在创建所有这些向量之后,显示其中最大的元素。毕竟当所有期货都准备好时,在所有期货的组合输出上执行函数句柄。

afterAll(f, @(r) disp(max(r)), 0);
0.9998

结合afterEach而且毕竟

您可以组合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);

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

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

异步更新用户界面使用afterEach而且毕竟

这个例子展示了如何在计算完成时更新用户界面。当您将计算卸给使用parfeval,当工人执行这些计算时,所有用户界面都是响应的。在本例中,您使用waitbar创建一个简单的用户界面。

  • 使用afterEach在每次计算完成后更新用户界面。

  • 使用毕竟在所有计算完成后更新用户界面。

使用waitbar要创建图形句柄,h.当你使用afterEach毕竟,waitbar函数更新图句柄。有关句柄对象的更多信息,请参见处理对象的行为

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

waitbar.png

使用parfeval计算随机矩阵特征值的实部。默认首选项,parfeval如果尚未创建并行池,则自动创建并行池。

idx = 1:10 0 f (idx) = parfeval (@ (n)真实(eig (randn (n))), 1、5 e2);结束

您可以使用afterEach的每个结果上自动调用函数parfeval计算。使用afterEach计算每个future完成后每个输出数组中的最大值。

maxFuture = afterEach (f @max 1);

您可以使用状态物业获得期货的地位。创建一个逻辑数组状态期货的属性f“完成”.使用的意思是计算完成期货的比例。然后,创建一个匿名函数updateWaitbar.的分数等待条长度h到完成的期货的一部分。

updateWaitbar = @(~) waitbar(mean({f。州}= =“完成”), h);

使用afterEach而且updateWaitbar在每个future in之后更新分数等待条长度maxFuture完成。使用毕竟而且删除在所有计算完成后关闭等待栏。

updateWaitbarFutures = afterEach (f updateWaitbar 0);毕竟(updateWaitbarFutures @(~)删除(h), 0);

使用毕竟而且柱状图显示结果的直方图maxFuture在所有的期货完成之后。

showsHistogramFuture =毕竟(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)试一试输出= fetchOutputs (f);%对输出做一些事情errordlg (“操作失败”);结束结束
Baidu
map