将回调应用于 MATLAB 作业调度器作业和任务
每当 MATLAB® 作业调度器集群中的作业或任务集群变化为特定状态时,MATLAB 作业调度器能够触发客户端会话中的回调。
代表 MATLAB 作业调度器集群中的作业和任务的客户端对象包括以下属性:
回调属性 | 对象 | 集群配置文件管理器字段 | 描述 |
---|---|---|---|
QueuedFcn | 仅限作业 | JobQueuedFcn | 指定当作业提交到 MATLAB 作业调度器队列时在客户端中执行的函数 |
RunningFcn | 作业或任务 |
| 指定作业或任务开始执行时在客户端中执行的函数 |
FinishedFcn | 作业或任务 |
| 指定作业或任务执行完毕后在客户端执行的函数 |
您可以将每个属性设置为集群配置文件管理器中任何有效的 MATLAB 回调值,请参阅表和 添加和修改集群配置文件。回调遵循与 Handle Graphics® 相同的行为,将发出调用的对象(作业或任务)和事件数据的空参量传递给回调函数。
这些属性仅在设置它们的客户端 MATLAB 会话中有效。访问相同作业或任务对象的后续会话不会继承先前会话的设置。您可以在命令行上将这些属性应用于现有的作业和任务,但集群配置文件设置仅在首次创建这些对象时应用。
注意
仅在使用 MATLAB 作业调度器集群时回调属性才可用。
此示例显示如何在客户端会话命令行创建作业和任务回调。
在 MATLAB 客户端路径下创建并保存一个回调函数 clientTaskCompleted.m
,内容如下:
function clientTaskCompleted(task,eventdata) disp(['Finished task: ' num2str(task.ID)])
创建一个作业并设置其 QueuedFcn
、RunningFcn
和 FinishedFcn
属性,使用向显示器发送信息的匿名函数的函数句柄。
c = parcluster('MyMJS'); j = createJob(c,'Name','Job_52a'); j.QueuedFcn = @(job,eventdata) disp([job.Name ' now ' job.State]); j.RunningFcn = @(job,eventdata) disp([job.Name ' now ' job.State]); j.FinishedFcn = @(job,eventdata) disp([job.Name ' now ' job.State]);
创建一个任务,其 FinishedFcn
是单独函数的函数句柄。
createTask(j,@rand,1,{2,4}, ... 'FinishedFcn',@clientTaskCompleted);
运行作业并记录作业和任务回调的输出消息。
submit(j)
Job_52a now queued Job_52a now running Finished task: 1 Job_52a now finished
要对给定集群上的任何作业和任务使用相同的回调,您应该在集群配置文件中设置这些属性。有关在配置文件管理器中编辑配置文件的详细信息,请参阅 发现集群并使用集群配置文件。这些属性设置适用于使用源自此配置文件的集群创建的任何作业和任务。顺序很重要,必须按以下顺序发生:
在配置文件管理器中设置配置文件的回调属性值。
使用集群配置文件在 MATLAB 中创建一个集群对象。
使用集群对象来创建作业,然后创建任务。
此示例显示如何使用配置文件管理器设置多个作业和任务回调属性。
在配置文件管理器中编辑您的 MATLAB 作业调度器集群配置文件,以便您可以将回调属性设置为与上一个示例中相同的值。保存的配置文件如下所示:
在 MATLAB 客户端路径下创建并保存一个回调函数 clientTaskCompleted.m
,内容如下。(如果您为前面的示例创建了该函数,则可以使用它。)
function clientTaskCompleted(task,eventdata) disp(['Finished task: ' num2str(task.ID)])
为集群、作业和任务创建对象。然后提交作业。所有回调属性都是在创建对象时从配置文件中设置的。
c = parcluster('MyMJS'); j = createJob(c,'Name','Job_52a'); createTask(j,@rand,1,{2,4}); submit(j)
Job_52a now queued Job_52a now running Finished task: 1 Job_52a now finished
提示
您应该避免在回调函数中运行可能导致冲突的代码。例如,如果作业中的每个任务都有一个绘制其结果的回调,则无法保证任务完成的顺序,因此绘图可能会相互覆盖。同样,某项作业的
FinishFcn
回调可能会在其所有任务的FinishFcn
回调完成之前被触发启动。使用
batch
进行的提交使用适用的作业和任务回调。并行池可以触发由其集群配置文件定义的作业回调。