2012-04-06 8 views
5

में मैं कुछ व्यवस्थापक यूटिलिटीज को थोड़ा वेब ऐप, जैसे "बैकअप डेटाबेस" में जोड़ना चाहता हूं। उपयोगकर्ता एक बटन पर क्लिक करेगा और HTTP प्रतिक्रिया तत्काल वापस आ जाएगी, हालांकि पृष्ठभूमि में संभावित रूप से लंबी चल रही प्रक्रिया शुरू हो गई है।"एक धागा स्पंज करें" -like व्यवहार node.js

जावा में यह शायद एक अभिनेता का उपयोग करके स्कैला में एक स्वतंत्र धागे को बढ़ाकर लागू किया जाएगा। लेकिन node.js में उपयुक्त मुहावरे क्या है? (कोड स्निपेट की सराहना की गई)

अब मैं दस्तावेज़ों को फिर से पढ़ रहा हूं, यह वास्तव में एक नोड 101 प्रश्न प्रतीत होता है लेकिन यह काफी है जहां मैं इस पर हूं ... किसी भी तरह, यह स्पष्ट करने के लिए मूल परिदृश्य है:

function onRequest(request, response) { 
    doSomething(); 
    response.writeHead(202, headers); 
    response.end("doing something"); 
} 

function doSomething(){ 
    // long-running operation 
} 

मैं प्रतिक्रिया वापस करना चाहता हूं, पृष्ठभूमि में चल रहे कुछ() को छोड़कर।

ठीक है, नोड के सिंगल-थ्रेड मॉडल को देखते हुए जो किसी अन्य ओएस-स्तरीय चाइल्डप्रोसेस के बिना संभव प्रतीत नहीं होता है। मेरी गलतफहमी

मेरे कोड में मुझे बैकअप के लिए जो चाहिए वह ज्यादातर I/O आधारित है, इसलिए नोड को इसे एक अच्छा एसिंक फैशन में संभालना चाहिए। मुझे क्या लगता है कि मैं करूँगा प्रतिक्रिया को बाद में कुछ करने के लिए कुछ बदलना है, देखें, यह कैसे व्यवहार करता है।

+0

मुझे विश्वास है कि आपने दस्तावेज़ों के माध्यम से ब्राउज़ किया है। http://nodejs.org/docs/v0.4.7/api/index.html मुझे लगता है कि यह आपकी प्रक्रिया की प्रकृति पर निर्भर करता है, लेकिन बाल प्रक्रिया पर नज़र डालें। – supertopi

+0

धन्यवाद। ऐसा लगता है कि मेरी समस्या कैसे नोड काम करता है की गहरी गलतफहमी में जड़ें थी :) बाल प्रक्रिया वह थी जो मुझे दिमाग में थी, हालांकि सबसे आसान समाधान नहीं, नीचे जो की प्रतिक्रिया देखें। – danja

उत्तर

3

मुझे समस्या नहीं दिखाई दे रही है। आपको बस इतना करना है कि doSomething() एसिंक्रोनस ऑपरेशन शुरू करें। यह तुरंत वापस आ जाएगा, आपके onRequest प्रतिक्रिया वापस लिखेंगे, और ग्राहक को "ठीक है, मैंने शुरू किया" संदेश प्राप्त होगा।

function doSomething() { 
    openDatabaseConnection(connectionString, function(conn) { 
     // This is called some time later, once the connection is established. 
     // Now you can tell the database to back itself up. 
    }); 
} 

doSomething सिर्फ वहाँ बैठेंगे नहीं जब तक डेटाबेस कनेक्शन स्थापित हो, या इंतजार जब आप इसे बैकअप लेने के लिए बताओ। यह तुरंत वापस आ जाएगा, एक कॉलबैक पंजीकृत है जो बाद में चलाएगा। दृश्यों के पीछे, आपकी डेटाबेस लाइब्रेरी शायद आपके लिए कुछ थ्रेड बना रही है, एसिंक को जिस तरह से काम करना चाहिए, उसे बनाने के लिए, लेकिन आपके कोड को इसके बारे में चिंता करने की आवश्यकता नहीं है; आप अभी तुरंत वापस आएं, तुरंत ग्राहक को प्रतिक्रिया भेजें, और एसिंक्रोनस कोड असीमित रूप से चल रहा है।

(यही वह रन तुल्यकालिक बनाने के लिए वास्तव में अधिक काम है -। आप doSomething में अपने response वस्तु पारित करने के लिए है, और doSomething, अंतरतम कॉलबैक अंदर response.end कॉल कर के बाद बैकअप किया जाता है है बेशक, यह नहीं है आप यहां क्या करना चाहते हैं; आप तुरंत वापस लौटना चाहते हैं, जो वास्तव में आपका कोड करेगा।)

+0

धन्यवाद। ऐसा लगता है कि मेरी समस्या कैसे नोड काम करता है की गहरी गलतफहमी में जड़ें थी :) – danja

5

जैसा कि सुपरर्टोपी ने कहा था कि आप Child process पर एक नज़र डाल सकते हैं। लेकिन मुझे लगता है कि यह आपके सर्वर के प्रदर्शन को चोट पहुंचाएगा, अगर यह बहुत अनुक्रमिक रूप से होता है। तब मुझे लगता है कि आपको उन्हें कतार में रखना चाहिए। मुझे लगता है कि आपको अपनी नौकरियों को ऑफ़लाइन (वितरित) संसाधित करने के लिए asynchronous message queues पर एक नज़र रखना चाहिए। कुछ (केवल दो नाम देने के लिए) संदेश कतार का उदाहरण beanstalkd, gearman है।

+0

धन्यवाद। ऐसा लगता है कि मेरी समस्या कैसे नोड काम करता है की एक गहरी गलतफहमी में जड़ें थी :) हालांकि एक कतार का उपयोग करना एक बहुत अच्छा विचार प्रतीत होता है। – danja