2012-06-03 7 views
8

मेरे Node.js स्क्रिप्ट डेटाबेस 1 में एक टेबल से पंक्तियों पढ़ता है, कुछ प्रसंस्करण करता है और डेटाबेस के लिए पंक्तियों लिखते 2.क्या एक Node.js स्क्रिप्ट बाहर निकलने के लिए एक अच्छा तरीका है के बाद "सब कुछ किया गया है"

सबकुछ पूरा होने के बाद स्क्रिप्ट को बाहर निकलना चाहिए।

मुझे कैसे पता चलेगा कि सबकुछ किया गया है और फिर नोड से बाहर निकलें?

अगर मैं इस तरह एक कॉलबैक फ़ंक्शन है:

function exit_node() { 
    process.exit(); 
} 

(संपादित करें: इस बीच में यह स्पष्ट हो गया है कि process.exit() भी db.close() के साथ प्रतिस्थापित किया जा सकता है - लेकिन यह नहीं है प्रश्न यह है कि सवाल क्या है। सवाल यह है कि इस समय वास्तव में ऐसा करने के लिए, यानी इस कॉलबैक को कैसे और कहाँ निष्पादित किया जाए।)

लेकिन इसे कहीं भी संलग्न करना आसान नहीं है। डीबी 1 से अंतिम पढ़ने के बाद सही नहीं है, क्योंकि प्रसंस्करण और लेखन अभी भी होना है।

डीबी 2 को लिखने के लिए इसे जोड़ना आसान नहीं है, क्योंकि इसे अंतिम लेखन के बाद संलग्न किया जाना है, लेकिन प्रत्येक लेखन अनिवार्य है और यह नहीं जानता कि यह आखिरी लेखन है या नहीं।

यह सैद्धांतिक रूप से भी हो सकता है, कि अंतिम लेखन समाप्त हो गया है, लेकिन इससे पहले एक और लेखन अभी भी निष्पादित है।


संपादित करें: क्षमा करें, मैं सवाल का विवरण देख सकते हैं पूर्ण और शायद भ्रमित नहीं है, लेकिन कुछ लोगों को अभी भी समझा और वहां से नीचे अच्छा जवाब नहीं है। कृपया टिप्पणियां और उत्तर पढ़ना जारी रखें और इसे आपको पूरी तस्वीर देनी चाहिए।


संपादित करें: मैं कुछ "अवरुद्ध" नियंत्रक तंत्र के बारे में सोच सकता हूं। स्क्रिप्ट के विभिन्न हिस्सों प्रत्येक खुले "नौकरी" के लिए नियंत्रक को अवरोधक जोड़ते हैं और नौकरी समाप्त होने के बाद उन्हें छोड़ देते हैं, और नियंत्रक स्क्रिप्ट से बाहर निकलता है जब कोई और बॉकर मौजूद नहीं होता है। शायद async मदद कर सकता है: https://github.com/caolan/async

मुझे यह भी डर है कि यह कोड और तर्क को अनुचित कर देगा।

+0

मुझे आपका प्रश्न नहीं समझ रहा है। जब सबकुछ किया जाता है तो नोड * बाहर निकलता है। एक बार जब एसिंक्रोनस कॉल प्रगति पर नहीं हो जाते हैं - एक बार जब आप अपने द्वारा पढ़े गए अंतिम रिकॉर्ड को संसाधित कर लेते हैं, और आपके सभी लेखन पूरा हो जाते हैं - तो नोड अपने आप से बाहर निकल जाएगा; आपको कुछ खास करने की ज़रूरत नहीं है। –

+6

@ जोहेइट कई डेटाबेस मॉड्यूल प्रक्रिया को चालू रखते हुए कनेक्शन खोलेंगे। मुझे लगता है कि सवाल (सही है अगर मैं गलत हूं, शर्नान्डेज़) यह जानना है कि जब नोड को इसके सभी डेटाबेस से संबंधित एसिंक आईओ के साथ किया जाता है, तो वह जान सकता है कि प्रक्रिया को बाहर निकलने के लिए डीबी कनेक्शन को बंद करने के लिए कब पता चल सकता है। –

+2

नोड तब तक बाहर नहीं निकलेगा जब तक कि एक या अधिक कॉलबैक प्रतीक्षा न हो या ईवेंट उत्सर्जक सक्रिय न हों। जैसा कि @ ब्रैंडन टिली ने उल्लेख किया है, डीबी-मॉड्यूल में से कुछ डीबी-कनेक्शन खुले रहते हैं (यह इवेंटइमीटर है), इसलिए आपको अपने प्रश्नों के साथ इसे बंद करना चाहिए। तो क्वेरी के कॉलबैक में 'db.close' जैसे कुछ लिखते हैं (दस्तावेज़ देखें), प्रक्रिया परिणाम और नोड स्वयं से बाहर निकलेंगे (बिना प्रक्रिया के' process.exit')। – elmigranto

उत्तर

3

हालांकि काउंटर का उपयोग कर आकर्षक हो सकता है (सरल, आसानी से कार्यान्वयन योग्य विचार), यह असंबंधित तर्क के साथ अपने कोड को प्रदूषित होगा।

db1.query(selector, function(err, results) { 
    db1.close(); 

    // let's suppose callback gets array of results; 
    // once all writes are finished, `db2.close` will be called by async 
    async.forEach(results, processRow, db2.close); 
}); 

// async iterator 
function processRow(row, cb) { 
    // modify row somehow 
    var newRow = foo(row); 

    // insert it in another db; 
    // once write is done, call `cb` to notify async 
    db2.insert(newRow, cb); 
} 

हालांकि, process.exit का उपयोग कर यहां सी ++ new की तरह लगता है मेरे लिए delete बिना। खराब तुलना शायद, लेकिन इसकी मदद नहीं कर सकता :)

+0

चयनकर्ता किसके लिए खड़ा है? (Db1.query का पहला पैरामीटर)? – SHernandez

+0

@SHernandez आप ** किसी भी तरह पंक्तियों का चयन करें, है ना? यदि यह पोस्टग्रेस है, तो 'चयनकर्ता' एक स्ट्रिंग होगा ('अभी चुनें(); 'या कुछ)। यदि यह अन्य डीबी है, तो चयनकर्ता कुछ और होगा। सम्मिलन पर 'newRow' के साथ वही बात। वैसे भी, यह मेरे जवाब में एक विचार था, असली कोड नहीं। – elmigranto

7

दो मुख्य विकल्प हैं:

  1. (के रूप में आप का उल्लेख) async की तरह एक अतुल्यकालिक प्रसंस्करण समन्वय मॉड्यूल का उपयोग करें।
  2. बकाया लेखन की अपनी खुद की गिनती रखें और फिर बाहर निकलने जब गिनती गिनती तक पहुँच जाता है 0.
+0

मुझे 2 पसंद नहीं है। समानांतर में अलग-अलग कॉलबैक दिनचर्या से एक ही वैश्विक काउंटर को बढ़ाने और घटाने में समस्या नहीं होनी चाहिए? आवेदन के विभिन्न हिस्सों से किसी भी समय बढ़ती और कमी हो सकती है, क्या मैं इसे नोड में कर सकता हूं? – SHernandez

+0

प्रसंस्करण के साथ कोई समस्या नहीं है, जबकि प्रसंस्करण असीमित है, यह अभी भी एकल धागा है। – JohnnyHK

+0

@SHernandez नोड में कुछ भी समानांतर नहीं है। आपकी पूरी परियोजना में कोड की दो पंक्तियां नहीं हैं, जो एक ही समय में चल रही हो सकती हैं। इसलिए, धारावाहिक पहुंच में कोई आवश्यकता नहीं है। – elmigranto

10

जॉनीएचके अच्छी सलाह देता है; Node.js को छोड़कर पहले से ही आपके लिए विकल्प 2 करता है।

जब कोई और I/o, टाइमर, अंतराल इत्यादि नहीं है (कोई और काम अपेक्षित नहीं है), प्रक्रिया बाहर निकल जाएगी।यदि आपका प्रोग्राम पूरा होने के बाद स्वचालित रूप से बाहर निकलता नहीं है, तो आपके पास एक बग है। शायद आप एक डीबी कनेक्शन, या clearTimeout() या clearInterval() को बंद करना भूल गए हैं। लेकिन process.exit() पर कॉल करने के बजाय आप अपने रिसाव की पहचान करने का अवसर ले सकते हैं।

+0

जेसनस्मिथ, यह दूसरी तरफ है, मैंने इस सवाल में व्याख्या करने की कोशिश की। क्योंकि मैं कॉलबैक का उपयोग करता हूं उनमें से कोई भी नहीं जानता कि अंतिम कौन सा है। और जैसे ही मुझे पता है, जब सबकुछ किया जाता है, तो मैं डीबी कनेक्शन या बाहर निकलने या जो कुछ भी बंद कर सकता हूं। लेकिन यह पहली बार मेरे प्रश्न का कारण था। – SHernandez

+2

यह है :), धन्यवाद, 'यदि आपका प्रोग्राम अपने सभी काम पूरा होने के बाद स्वचालित रूप से बाहर नहीं निकलता है, तो आपके पास एक बग है' – Rabea

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