2012-01-26 11 views
11

Duplicar posibles:
How do you handle resources in MATLAB in an exception safe manner? (like “try … finally”)tratar ... finalmente equivalente en Matlab

utilizo Matlab caja de herramientas de cálculo paralelo de esta manera:

matlabpool open 

parfor … 

matlabpool close 

Si se produce un error en parfor, la programa se termina y matlabpool no está cerrado. Cuando soluciono el error y lo vuelvo a ejecutar, matlabpool open falla porque ya está abierto. Entonces debo cerrarlo manualmente, lo cual siempre olvido. La forma ideal sería cambiar a (pseudo-código):

matlabpool open 
try 
    parfor … 
finally 
    matlabpool close 
end 

¿Hay alguna buena práctica para esto?

+1

Estoy de acuerdo; dup. Sin embargo, el otro era más difícil de encontrar en la búsqueda. Me preocupé por su título para que apareciera en una búsqueda de "matlab finalmente". –

Respuesta

21

Utilice onCleanup. Te permitirá configurar el código que se ejecutará cuando salgas del alcance, independientemente de una salida normal o de error. Así que funciona como finalmente, además de anular las excepciones en la limpieza, y todos los onCleanup s son independientes.

function doSomething 
matlabpool open 
cleaner = onCleanup(@() matlabpool('close')); 
parfor ... 
%// and then no need to call close here 

es necesario cambiar la try...finally a una función, o pegarlo dentro de una, para que esto funcione bien. El código de limpieza solo se ejecuta con la GC borra el contenido de cleaner, que ocurre cuando su espacio de trabajo queda fuera del alcance cuando sale de la función (o cuando la borra manualmente). A diferencia de otros lenguajes, el bloque try de Matlab no es un ámbito léxico para las variables; las variables asignadas por primera vez dentro de un try se mantendrán hasta que se deje su función envolvente. Lo mismo para todos los otros bloques: la función es el único nivel de alcance para vidas variables locales.

+0

+1 Porque fuiste más rápido que yo :) –

+4

Ten en cuenta que esto solo se ejecuta cuando sales de la función, en lugar de dejar el 'try ... catch'. En este caso, no creo que importe. – Nzbuu

+0

Igual que Andrey. – Marc