2012-01-26 5 views
11

可能性の重複: MATLABで最終的に同等のtry ...


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

私は同意します。 dup。もう一方は検索で見つけにくかった。私はそのタイトルでうんざりしたので、 "matlab"の検索で最終的に表示されるだろう。 –

答えて

21

onCleanupを使用してください。正常終了またはエラー終了に関係なく、スコープを終了したときに実行されるコードを設定できます。したがって、最終的には機能し、クリーンアップでは例外を取り消し、onCleanupはすべて独立しています。

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

あなたは、これが正しく動作するために、関数にtry...finallyを変更、または1つの内側にそれを固執する必要があります。クリーンアップコードは、GCを使用して実行されると、cleanerの内容が消去されます。これは、機能を終了するとき(または手動でクリアするとき)にワークスペースが有効範囲外になるときに発生します。他の言語とは異なり、Matlabのtryブロックは変数の字句範囲ではありません。 tryの中で最初に割り当てられた変数は、その囲み関数が残されるまでくりぬきます。他のすべてのブロックでも同じです。この関数は、ローカル変数の存続期間のスコープの唯一のレベルです。

+0

+1あなたが私よりも速いので: –

+4

これは、 'try ... catch'を残すのではなく、関数を終了するときにのみ実行されることに注意してください。この場合、私はそれが重要だとは思わない。 – Nzbuu

+0

Andreyと同じです。 – Marc