文档

使用回调函数

在本例中,我们将看到如何在并行计算工具箱™中使用回调函数在任务完成时通知我们,以及在任务结果可用时更新图形。我们还会看到如何使用用户数据属性,用于在MATLAB会话和回调函数之间来回传递数据。

先决条件:

进一步阅读,请参阅:

检查回调

并行计算工具箱为我们提供了在这些事件发生时调用用户定义函数的能力:

  • 一个作业被排队

  • 正在运行的工作开始

  • 运行的任务开始

  • 任务完成

  • 工作完成

但是请注意,回调仅对MJS集群可用,对其他集群类型不可用。因此,我们首先要确保使用的是MJS集群。调用parcluster如果没有输入,我们将使用默认配置文件获得一个集群。

myCluster中= parcluster;如果~ isa (myCluster“parallel.cluster.MJS”)错误('pctexample:回调:NotMJS'...[“本示例使用回调,这是仅适用于”...“的MJS簇”。]);结束

示例:创建完成任务的回调函数

让我们创建一个简单的任务完成的回调函数开始。它的唯一目的是为了显示完成的日期和时间。因为任务完成的回调函数,就是这么简单,我们将创建它作为一个匿名函数,而不是在一个单独的文件MATLAB写它的。

callbackfcn = @(mytask,EVENTDATA)DISP(datestr(时钟));

我们甚至可以在命令行中调用这个函数,它会打印出当前日期和时间。

callbackfcn ();
12 - 5月- 2014 09:08:07

我们可以创造一个工作和一个任务FinishedFcn属性被设置为callbackfcn。然后我们提交作业并等待它完成。然后MATLAB将调用callbackfcn当任务改变其状态,以完成功能。

工作= createJob (myCluster);任务= createTask(job, @sqrt, 1, {2});的任务。FinishedFcn = callbackfcn;提交(工作);等待(工作);删除(工作);
12 - 5月- 2014 09:08:09

示例:使用的UserData属性以跟踪剩余任务的数

现在,我们增强了前面的例子来说明如何完成任务的回调函数可以使用用户数据作业的属性来访问客户端计算机上的MATLAB工作区。请看下面的例子:我们用一个计数器来跟踪多少任务正在运行的,任务完成回调函数递减此计数器并显示其价值。我们将计数器存储在用户数据属性,并且任务完成后的函数可以通过任务的性质。

类型pctdemo_taskfin_callback1
功能pctdemo_taskfin_callback1(任务,〜)的剩余任务%PCTDEMO_TASKFIN_CALLBACK1计数的数量。%该功能显示了任务完成的回调函数如何访问作业%的UserData属性和修改。%版权所有2007-2011 MathWorks公司,工作的公司的%的UserData属性是用来%的剩余任务数的计数器。我们通过一个递减的。工作= task.Parent;numTasksLeft = GET(作业 '的UserData');numTasksLeft = numTasksLeft  -  1;集(工作, '的UserData',numTasksLeft);%显示有关多少任务有离开的消息。如果(numTasksLeft> 1)fprintf中( '现在有%d任务左\ N',numTasksLeft); elseif (numTasksLeft == 1) disp('There is now 1 task left'); else disp('Finished with all the tasks'); end end % End of pctdemo_taskfin_callback1.

让我们创建一个小的工作numTasks任务,看看任务完成的回调函数模样的输出。

工作= createJob (myCluster);numTasks = 5;的工作。用户数据= numTasks;对于I = 1:numTasks任务=的CreateTask(作业,@sqrt,1,{I});task.FinishedFcn = @ pctdemo_taskfin_callback1;结束提交(工作);等待(工作);删除(工作);
现在有4个任务留给现在有3个任务留给现在有2个任务现在剩下的有1个任务完成剩下的所有任务

实例:更新在回调函数图形

现在我们转向任务完成回调函数的更高级用法,即使用它向描述任务结果的图中添加数据点。让我们看看回调函数:

类型pctdemo_taskfin_callback2;
pctdemo_taskfin_callback2(task, ~) % pctdemo_taskfin_callback2使用任务输入和输出数据更新一个图。该函数将当前任务结果添加到描述到目前为止获得的所有结果的图形中。MathWorks, Inc. %找到我们想要修改的图形,并将任务输入和输出%数据分别添加到图形的x轴和y轴上。p = findobj('Tag', 'pctdemo_taskfin_callbacks2_plot');如果~ishandle(p) %我们不能绘制到一个不存在的图上。返回;get(task, 'InputArguments');outArgs = get(任务,'OutputArguments');currX = inArgs {1};咖喱= outArgs {1}; % Add the point (currX, currY) to the list of points currently on the graph. x = get(p, 'XData'); y = get(p, 'YData'); x = [x, currX]; y = [y, currY]; % We want the lines connecting the data points to approximate the graph of % the function, so we sort the data points by their x-value. [x, ind] = sort(x); y = y(ind); % Update the graph. set(p, 'XData', x, 'YData', y) end % End of pctdemo_taskfin_callback2.

我们设置这个示例的方式,我们准备的图表通过调用函数绘制pctdemo_taskfin_callback2_setup以产生具有一个空的图表的图。让我们来看看这个函数:

类型pctdemo_taskfin_callback2_setup;
功能pctdemo_taskfin_callback2_setup()%pctdemo_taskfin_callback2_setup准备的图绘制的曲线图。%的函数初始化输出数字和标记它,以便%PCTDEMO_TASKFIN_CALLBACK2可以访问它并修改其曲线图。%版权所有2007 MathWorks公司P = findobj( '标签', 'pctdemo_taskfin_callbacks2_plot');如果的isEmpty(P)||〜ishandle(p)的图图=;图(图);P =情节(NaN时,NaN时, '.-');组(P, '标签', 'pctdemo_taskfin_callbacks2_plot');标题(“平方根函数”);端组(P, '扩展数据',[], 'YDATA',[])pctdemo_taskfin_callback2_setup的端%终结。

现在运行该函数来显示空图形。

pctdemo_taskfin_callback2_setup();

为了演示目的,我们让task一世计算√我。任务完成的回调函数,然后将任务结果来描绘迄今取得的所有结果的图表。我们使用了大量的任务,强调如何图表逐渐导致滴入作业建成,我们对序列进行随机洗牌1:numTasks使平方根函数的值,在真正的随机顺序到达。

工作= createJob (myCluster);numTasks = 20;seq = randperm (numTasks);序列的%随机打乱1:numTasks。对于seq task = createTask(job, @sqrt, 1, {i});的任务。FinishedFcn = @pctdemo_taskfin_callback2;结束提交(工作);等待(工作);删除(工作);

这个话题有用吗?