मैं एक साइट का निर्माण कर रहा हूं और एक विशेष ऑपरेशन चलाने के लिए एक लंबी, सर्वर-साइड प्रक्रिया ट्रिगर करता है। यह ऑपरेशन एक ही समय में दो बार नहीं चलाया जा सकता है, इसलिए मुझे किसी प्रकार की सुरक्षा लागू करने की आवश्यकता है। इसे सिंक्रोनस भी नहीं बनाया जा सकता है, क्योंकि सर्वर को चलाने के दौरान अन्य अनुरोधों का जवाब देना जारी रखना पड़ता है।एक समय में केवल एक एसिंक ऑपरेशन की अनुमति
मैं इस छोटी सी अवधारणा परीक्षण का निर्माण किया गया है इसके लिए अपने वास्तविक लंबी चलने वाली प्रक्रिया के लिए एक विकल्प के रूप में sleep 5
का उपयोग कर (की आवश्यकता है और बच्चे की प्रक्रिया वादा व्यक्त करते हैं, एक sleep
कमांड के साथ एक सिस्टम पर चलता लेकिन स्थानापन्न विंडोज के लिए जो कुछ भी):
var site = require("express")();
var exec = require("child-process-promise").exec;
var busy = false;
site.get("/test", function (req, res) {
if (busy) {
res.json({status:"busy"});
} else {
busy = true; // <-- set busy before we start
exec("sleep 5").then(function() {
res.json({status:"ok"});
}).catch(function (err) {
res.json({status:err.message});
}).then(function() {
busy = false; // <-- finally: clear busy
});
}
});
site.listen(8082);
इस के इरादे जब "/ परीक्षण" अनुरोध किया जाता है कि यह एक लंबे समय के आपरेशन से चलाता है, और अगर "/ परीक्षण" फिर से अनुरोध किया जाता है, जबकि यह चल रहा है है, इसके साथ उत्तर " व्यस्त "और कुछ भी नहीं करता है।
मेरा सवाल यह है कि, यह कार्यान्वयन सुरक्षित और सही है? ऐसा लगता है कि मेरे कर्सर परीक्षणों में काम करता है लेकिन यह संदिग्ध रूप से सरल है। क्या यह अनिवार्य रूप से म्यूटेक्स + को "ट्राइक-लॉक" ऑपरेशन को लागू करने का उचित तरीका है, या क्या कुछ और उचित Node.js निर्माण है? उन भाषाओं से आ रहा है जहां मुझे मानक मल्टीथ्रेडिंग प्रथाओं के लिए उपयोग किया जाता है, मैं नहीं नोड के सिंगल-थ्रेडेड-लेकिन-असिंक्रोनस प्रकृति के साथ सहज हूं।
आप ठीक हैं - जावास्क्रिप्ट कोड नोड में अन्य जेएस कोड के साथ एक साथ नहीं चल सकता है, इसलिए आपके नीचे से व्यस्त ध्वज को कुछ भी नहीं बदलेगा। बहुप्रचारित स्टाइल मॉनीटर या महत्वपूर्ण वर्गों की कोई आवश्यकता नहीं है। –
तो स्पष्ट होने के लिए, लंबे समय तक चलने वाली प्रक्रिया को सर्वर की बाल प्रक्रिया के रूप में निष्पादित किया जाता है, यह सर्वर (नोड.जेएस) द्वारा स्वयं नहीं चलाया जाता है? –
@ फ़ेलिक्सक्लिंग मैं बिल्कुल * निश्चित नहीं हूं कि मैं इस प्रश्न को समझता हूं, इसलिए यहां यादृच्छिक बयानों का एक समूह है: इसे निष्पादित किया गया है, न कि स्पॉन - यह है कि मुझे इसके आउटपुट को पढ़ने या इसकी प्रगति को ट्रैक करने की आवश्यकता नहीं है, प्रक्रिया केवल सामानों का एक समूह है जो थोड़ी देर लेती है और मुझे केवल अंतिम परिणाम की परवाह है। साथ ही यह स्वचालित रूप से या अंतराल पर नहीं चलाया जाता है, यह एक HTTP अनुरोध के माध्यम से सीधे अंत उपयोगकर्ता द्वारा ट्रिगर किया जाता है, जिस बिंदु पर मैं इसे निष्पादित करता हूं, और स्थिति को अंतिम उपयोगकर्ता को वापस कर देता हूं। क्या इनमें से कोई भी आपके प्रश्न का उत्तर देता है? यदि आप सोचते हैं कि यह महत्वपूर्ण है तो मैं भी अपने वास्तविक उपयोग-मामले को समझा सकता हूं। –