parfor循环中的matlab事件

parfor循环中的matlab事件,matlab,events,parallel-processing,Matlab,Events,Parallel Processing,我有一个依赖于事件的系统,为了加速系统,我尝试将其并行化,但是事件似乎不会在并行循环中触发。因为我的系统太大了,所以我把它归结为大约30行(3个文件) classdef eventsend

我有一个依赖于事件的系统,为了加速系统,我尝试将其并行化,但是事件似乎不会在并行循环中触发。因为我的系统太大了,所以我把它归结为大约30行(3个文件)

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