Попробуйте... окончательно эквивалент в Matlab

Возможный дубликат:
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

Есть ли какая-нибудь лучшая практика для этого?

Ответ 1

Используйте 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, будут придерживаться, пока не будет оставлена ​​их закрывающая функция. То же самое для всех остальных блоков: функция является единственным уровнем охвата локальных переменных времени жизни.