我怎么能监听完成工作吗?

18视图(30天)
我使用一个非常大而复杂的GUI,用于处理成百上千的文件。可以独立处理很多文件,每个文件可能需要几分钟的过程,使它们非常适合并行处理。
我想更新GUI每当文件进行处理。得到结果并行处理的标准方式是使用fetchOutputs或fetchNext。然而,这些功能块的延续,从而干扰我的与GUI交互能力。
在我看来,这样做最好的方法是简单地倾听每个工作,完成任务,或者未来。然而,只ObjectBeingDestroyed事件似乎这些对象。他们有一个国有资产可以用来确定他们是否已经完成,但是这个属性不是SetObservable。
我可以调查国有资产(或调查fetchNext超时)使用一个循环或定时器并通知时‘完成’,但我认为将很难管理,并在MATLAB端占用的资源。
那么有什么办法可以监听完成工作吗?

答案(4)

莱昂内尔
莱昂内尔 2018年1月9日
好吧,看来我发现答案使用函数包含在2017版本。
%首先定义一个平行的池
poolobj = parpool (“本地”1);
%,然后创建一个数据队列
q = parallel.pool.DataQueue;
%,队列创建一个监听器
侦听器= afterEach (q, @testevent);
%,开始数据处理(注意,必须通过队列)
f = parfeval (@testfun 0数据,q);
函数testfun必须接受队列作为参数和触发事件通过发送:
函数问testfun(数据)
%处理数据
发送(q, dataprocessed)
结束
一旦发回的数据,它触发函数testevent和数据作为参数给出:
函数testevent (dataprocessed)
%执行一些操作
一个可以使用这个与本地工作区和处理来存储结果直接进入工作区。要做到这一点,取代线:
侦听器= afterEach (q, @testevent);
由:
侦听器= afterEach (q, makeListenerHandle (someHandle));
在函数makeListenerHandle生成一个处理一个嵌套的函数:
函数functionHandle = makeListenerHandle (handleStructure)
functionHandle = @LocalFunction;
函数LocalFunction (dataprocessed)
handleStructure。dataprocessed = dataprocessed;
结束
结束
我做了一些脚本和工作在2017版本,使用windows 10。
2的评论

登录置评。


Edric埃利斯
Edric埃利斯 2017年1月27日
不幸的是,目前还没有办法的事件通知 parallel.Future 返回的对象 parfeval
在某些情况下(即只 乔丹 集群类型) 各种回调: //www.tianjin-qmedu.com/help/distcomp/apply-callbacks-to-mjs-jobs-and-tasks.html
1评论
亚历山大
亚历山大 2017年1月27日
谢谢你的帮助。我害怕这是真的。我可以看看乔丹集群在未来,但配置一个乔丹似乎更复杂的轮询在目前的发展阶段。

登录置评。


沃尔特·罗伯森
沃尔特·罗伯森 2017年1月27日
parfeval ()。创造未来。你可以检查 状态 财产的期货没有等待他们完成。
1评论
亚历山大
亚历山大 2017年1月27日
编辑:亚历山大 2017年1月27日
谢谢你的输入。
然而,正如我所提到的我的问题,检查国家财产需要轮询,占用资源在客户端完成,远远比听更复杂的事件。我只会使用这项技术如果没有监听方式完成工作。

登录置评。


莱昂内尔
莱昂内尔 2018年1月8日
嗨,抱歉恢复一个老帖子,但是我感兴趣相同的问题:如何触发事件完成parfeval任务。我看到parfeval对象有一个‘ObjectBeingDestroyed’事件可能是有用的。有没有办法自动销毁parfeval对象其任务完成时?如果是这种情况,那么我可以设置一个事件对象被销毁前和收集数据。

类别

找到更多的在集群和云帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!