parfor循环中的matlab事件
我有一个依赖于事件的系统,为了加速系统,我尝试将其并行化,但是事件似乎不会在并行循环中触发。因为我的系统太大了,所以我把它归结为大约30行(3个文件)parfor循环中的matlab事件,matlab,events,parallel-processing,Matlab,Events,Parallel Processing,我有一个依赖于事件的系统,为了加速系统,我尝试将其并行化,但是事件似乎不会在并行循环中触发。因为我的系统太大了,所以我把它归结为大约30行(3个文件) classdef eventsend
classdef eventsend
这将打印<代码>此处一次,但如果删除了PAR,它将工作并打印6次。
问题:有没有一种方法可以使它并行化并且仍然有事件?让我们回顾一下在本地或远程工作者池上执行
parfor
循环时会发生什么:
(0)为每个工作者生成一个单独的Matlab实例
(1) 循环中所需的函数工作区中的变量将写入磁盘(如果parfor循环在本地运行,它们实际上不会写入磁盘,但出于所有实际目的,它们看起来就像是在磁盘上运行的一样)。如果parfor远程运行,那么所有的.m文件也会被发送到远程工作者
(2) 每个Matlab实例加载与它们应该计算的迭代相关的变量,并运行parfor
循环体
您的问题源于以下事实:事件无法在Matlab实例之间传递,或者您没有在加载时构造eventsent
/eventcatch
,这意味着它们不再正确侦听
一般来说,我发现围绕类而不是在方法中进行parfor
循环更容易,这样我就不必担心保存/加载对象的有趣的副作用。请注意,对于第(1)点,parfor
循环中所需的变量实际上并没有写入磁盘(在交互式并行池的情况下),但对handle
类(和其他类)的影响就好像它们已写入磁盘一样。
classdef eventsend < handle
events
go
end
methods
function sendit(self)
notify(self,'go');
end
end
end
classdef eventcatch
methods
function self = eventcatch(sender)
addlistener(sender,'go',@self.doSomething);
end
function doSomething(varargin)
disp('HERE');
end
end
end
function bug
send = eventsend();
eventcatch(send);
a = @send.sendit;
a();
parfor i=1:5
a();
end
end