2013-12-08 10 views
5

रिसाव मैंने देखा है कि काफी हर ट्यूटोरियल की तरह कुछ सिखाता है:Node.js स्ट्रीम एपीआई

// Get Google's home page. 
require('http').get("http://www.google.com/", function(response) { 
    // The callback provides the response readable stream. 
    // Then, we open our output text stream. 
    var outStream = require('fs').createWriteStream("out.txt"); 

    // Pipe the input to the output, which writes the file. 
    response.pipe(outStream); 
}); 

लेकिन यह एक बहुत खतरनाक टुकड़ा कोड है, मेरी राय में। क्या होता है यदि फ़ाइल स्ट्रीम किसी बिंदु को अपवाद फेंकता है? मुझे लगता है कि फ़ाइल स्ट्रीम स्मृति को रिसाव कर सकती है क्योंकि दस्तावेज़ों के अनुसार फ़ाइल स्ट्रीम स्पष्ट रूप से बंद नहीं है।

क्या मुझे परवाह करना चाहिए? मेरे विकल्प में node.js धाराओं को परिस्थितियों को संभालना चाहिए ...

उत्तर

2

नोड के वीएम में किसी भी बग को बाधित करना, अगर कोई अपवाद है जो धारा खोले जाने के बाद ऑपरेशन में बाधा डालता है, तो मैं उम्मीद करता हूं कि अंततः कचरा संग्रह के दौरान वीएम यह पता लगाएगा कि कुछ भी धारा का जिक्र नहीं कर रहा है और इसे इकट्ठा करेगा, जिससे इससे जुड़े संसाधनों का निपटान किया जा सकेगा।

तो मैं इसे "रिसाव" नहीं कहूंगा।

अभी भी हैंडलिंग अपवादों को बंद करने या स्ट्रीम बंद करने में समस्याएं हो सकती हैं। उदाहरण के लिए, यूनिक्स-प्रकार सिस्टम पर जब कोई स्ट्रीम बनाई जाती है जो डिस्क पर फ़ाइल से मेल खाती है, तो फ़ाइल डिस्क्रिप्टर का उपयोग किया जाता है। एक प्रक्रिया में एक बार में कितने फ़ाइल डिस्क्रिप्टर खोले जा सकते हैं इसकी एक सीमा है। नतीजतन, अगर ऐसी प्रक्रिया जो स्पष्ट रूप से अपनी धाराओं को बंद नहीं करती है, तो इनमें से कई को छोड़ने का प्रबंधन होता है कि यह अगले कचरा संग्रह से पहले फ़ाइल डिस्क्रिप्टर सीमा को हिट करता है, यह क्रैश हो जाएगा।

+0

यह मूल रूप से मैंने सोचा था। इसलिए गंतव्य स्ट्रीम विफल होने पर एक गंतव्य स्ट्रीम पर पाइप स्रोत स्रोत बंद नहीं होता है (अपवाद-वार)। – Kr0e

+0

जैसे ही अपवाद होता है, यह बंद नहीं होता है, लेकिन कचरा संग्रह इसे प्राप्त करना चाहिए और इसे बंद करना चाहिए। – Louis

4

फ़ाइल वर्णनकर्ता रिसाव से बचने के लिए, आप भी जरूरत है:

var outStream = require('fs').createWriteStream("out.txt"); 

// Add this to ensure that the out.txt's file descriptor is closed in case of error. 
response.on('error', function(err) { 
    outStream.end(); 
}); 

// Pipe the input to the output, which writes the file. 
response.pipe(outStream); 

एक और गैर-दस्तावेजी विधि outStream.destroy(), जो वर्णनकर्ता के रूप में अच्छी तरह से बंद कर देता है है, लेकिन ऐसा लगता है कि outStream.end() पसंदीदा है।