2012-01-26 11 views
11

संभव डुप्लिकेट:
How do you handle resources in MATLAB in an exception safe manner? (like “try … finally”)कोशिश ... अंत में मैटलैब में बराबर

मैं इस तरह का उपयोग मैटलैब समानांतर कंप्यूटिंग टूलबॉक्स:

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 बदलने के लिए, या एक के अंदर यह छड़ी, यह सही काम करने के लिए की जरूरत है। क्लीनअप कोड केवल जीसी के साथ निष्पादित हो जाता है cleaner की सामग्री को साफ़ करता है, जो तब होता है जब फ़ंक्शन छोड़ते समय उसका वर्कस्पेस गुंजाइश से बाहर हो जाता है (या जब आप इसे मैन्युअल रूप से साफ़ करते हैं)। कुछ अन्य भाषाओं के विपरीत, मैटलैब का try ब्लॉक चर के लिए एक व्याख्यात्मक दायरा नहीं है; try के अंदर पहली बार असाइन किए गए वेरिएबल तब तक चिपके रहेंगे जब तक कि उनके संलग्न कार्य को छोड़ दिया न जाए। अन्य सभी ब्लॉक के लिए समान: फ़ंक्शन स्थानीय परिवर्तनीय जीवनकाल के लिए स्कोपिंग का एकमात्र स्तर है।

+0

+1 क्योंकि आप मुझसे तेज़ थे :) –

+4

ध्यान दें कि जब आप 'कोशिश करें ... पकड़' छोड़ने के बजाए फ़ंक्शन छोड़ते हैं तो यह केवल तभी निष्पादित होता है। इस मामले में, मुझे नहीं लगता कि यह महत्वपूर्ण है। – Nzbuu

+0

एंड्री के समान। – Marc

संबंधित मुद्दे