可能重复:
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
这有什么最好的做法吗?
答案 0 :(得分:20)
使用onCleanup
。它允许您设置在退出作用域时将执行的代码,无论正常还是错误退出。所以它最终起作用,加上它在清理中排除异常,并且所有onCleanup
都是独立的。
function doSomething
matlabpool open
cleaner = onCleanup(@() matlabpool('close'));
parfor ...
%// and then no need to call close here
您需要将try...finally
更改为一个功能,或将其粘贴到一个功能中,以使其正常工作。清理代码仅在GC清除cleaner
的内容时执行,当您离开函数时(或手动清除它)时,它的工作区超出范围。与其他一些语言不同,Matlab的try
块不是变量的词法范围;第一次在try
内分配的变量将一直存在,直到它们的封闭函数被留下。对于所有其他块也是如此:该函数是局部变量生存期的唯一范围。