Matlab中COM实例的并行执行
我正试图通过使用Mathworks的ParralelToolbox来加速我们的测试环境。但是,我无法并行启动多个Matlab实例(到目前为止,我们按顺序运行测试,每个测试都通过ActX服务器启动一个新的Matlab实例)。 所以当我运行下面的代码时Matlab中COM实例的并行执行,matlab,matlabpool,Matlab,Matlabpool,我正试图通过使用Mathworks的ParralelToolbox来加速我们的测试环境。但是,我无法并行启动多个Matlab实例(到目前为止,我们按顺序运行测试,每个测试都通过ActX服务器启动一个新的Matlab实例)。 所以当我运行下面的代码时 ML=ver('Matlab'); ML_Path=matlabroot; ML_Ver=ML.Version; parfor i = 1:3 NewMatlab = actxserver(['matlab.application.singl
ML=ver('Matlab');
ML_Path=matlabroot;
ML_Ver=ML.Version;
parfor i = 1:3
NewMatlab = actxserver(['matlab.application.single.',ML_Ver])
Answer = NewMatlab.Feval('test',1);
NewMatlab.Quit;
NewMatlab.release;
end
Matlab实例是按顺序调用的(test只是一个非常简单的脚本,它总结了几个数字)
但是如果我通过命令行启动一个新的Matlab
ML=ver('Matlab');
ML_Path=matlabroot;
ML_Ver=ML.Version;
parfor i = 1:3
dos('matlab -nodesktop -minimize -wait -batch "test"');
end
它起作用了。我发现这两种方法在启动Matlab的处理上有很大的不同,但是第一种方法是如果您想让
测试的每次迭代都在一个完全独立的Matlab实例中运行,您可以使用该函数,如下所示:
for i = 1:3
j(i) = batch(@test, nOut, {argsIn...});
end
% Later, collect results
for i = 1:3
wait(j(i)), fetchOutputs(j(i))
end
或者,您可以直接使用parfor
parpool() % If necessary
parfor i = 1:3
out{i} = test(...)
end
(如果当前没有打开池,您只需要调用parpool
,并且您设置了首选项,以便在点击parfor
时不会自动创建池)。好的,我们打算做的是并行执行Simulink测试。目前,我们通过ActiveX为每个测试启动一个新的Matlab实例,并按顺序运行测试。背景是,如果一个测试导致Matlab崩溃(是的,这种情况经常发生…),我们仍然可以测试其他模型parfor
对所有迭代使用相同的工作空间;这不会起作用,因为每个测试都有自己的环境,batch
可能会起作用,但它不能解决我们通过单独的Matlab实例避免的稳定性问题…batch
对每个任务使用单独的Matlab工作进程。