Possible Duplicate:
How do you handle resources in MATLAB in an exception safe manner? (like “try … finally”)
我是这样使用Matlab并行计算工具箱的:
matlabpool open
parfor …
matlabpool close
如果parfor
发生错误,程序终止,matlabpool不关闭。当我修复错误并再次运行时,matlabpool open
失败,因为它已经打开。所以我需要手动关闭它,我总是忘记这一点。理想的方法是将其更改为(伪代码):
matlabpool open
try
parfor …
finally
matlabpool close
end
对此有什么最佳实践吗?
使用onCleanup
。它会让您设置在您退出作用域时执行的代码,无论是正常退出还是错误退出。所以它的工作方式与 finally 类似,而且它消除了清理中的异常,并且所有 onCleanup
都是独立的。
function doSomething
matlabpool open
cleaner = onCleanup(@() matlabpool('close'));
parfor ...
%// and then no need to call close here
您需要将 try...finally
更改为一个函数,或者将其粘贴在一个函数中,这样才能正常工作。清除代码仅在 GC 清除 cleaner
的内容时执行,当您离开该函数(或您手动清除它)时它的工作区超出范围时会发生这种情况。与其他一些语言不同,Matlab 的 try
block 不是变量的词法作用域;在 try
中首次赋值的变量将一直存在,直到它们的封闭函数被保留。所有其他 block 都相同:函数是局部变量生命周期范围的唯一级别。