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