NTime.JS में सेटटाइमआउट कैसे काम करता है?


112

मुझे लगता है कि एक बार इसे क्रियान्वित करने के बाद यह कतार में है, लेकिन कतार में कोई आश्वासन है कि यह एक्स मिलीसेकंड के बाद बिल्कुल लागू होगा? या कतार पर अन्य भारी कार्य अधिक होने से इसमें देरी होगी?


14
कोई भी गैर-रियलटाइम ऑपरेटिंग सिस्टम गंभीर सटीकता की गारंटी देने के लिए कभी भी वहां संभव नहीं होगा। सिस्टम पर सभी प्रकार की चीजें टाइमर तंत्र के रास्ते में (और इच्छाशक्ति) प्राप्त कर सकती हैं।
नुकीले

जवाबों:


174

सेटटाइमआउट के शब्दार्थ लगभग एक वेब ब्राउज़र की तरह ही होते हैं: टाइमआउट आर्ग को निष्पादित करने से पहले प्रतीक्षा करने के लिए एमएस की न्यूनतम संख्या होती है, गारंटी नहीं। इसके अलावा, 0, एक गैर-संख्या, या एक नकारात्मक संख्या, गुजरने से यह एमएस की न्यूनतम संख्या की प्रतीक्षा करने का कारण होगा। नोड में, यह 1ms है, लेकिन ब्राउज़रों में यह 50ms जितना हो सकता है।

इसका कारण यह है कि जावास्क्रिप्ट द्वारा जावास्क्रिप्ट का कोई प्रसार नहीं है। इस उदाहरण पर विचार करें:

setTimeout(function () {
  console.log('boo')
}, 100)
var end = Date.now() + 5000
while (Date.now() < end) ;
console.log('imma let you finish but blocking the event loop is the best bug of all TIME')

यहाँ प्रवाह है:

  1. 100ms के लिए समय-सारणी निर्धारित करें।
  2. 5000ms के लिए व्यस्त है।
  3. ईवेंट लूप पर वापस लौटें। लंबित टाइमर के लिए जाँच करें और निष्पादित करें।

यदि यह मामला नहीं था, तो आपके पास जावास्क्रिप्ट का एक बिट "बाधित" दूसरा हो सकता है। हमें म्यूटेक्स और सेमाफोर सेट करना होगा और इस तरह से कोड को रोकने के लिए इस तरह से बेहद कठिन होने से रोका जा सकता है:

var a = 100;
setTimeout(function () {
  a = 0;
}, 0);
var b = a; // 100 or 0?

नोड के जावास्क्रिप्ट निष्पादन की एकल-सूत्रता, इसे संगामिति की अधिकांश अन्य शैलियों के साथ काम करने के लिए बहुत सरल बनाता है। बेशक, व्यापार बंद है कि यह पूरी तरह से एक अनंत लूप के साथ ब्लॉक करने के लिए कार्यक्रम के बुरी तरह से व्यवहार वाले हिस्से के लिए संभव है।

क्या यह शिकार की जटिलता से लड़ाई के लिए एक बेहतर दानव है? वह निर्भर करता है।


20
आपको असाधारण सटीक console.logसंदेश के लिए +1 मिलता है ।
निधि मोनिका का मुकदमा

मुझे पसंद है कि कैसे आप अपने स्ट्रिंग में ऊपरी आवरण समय। बहुत अच्छी व्याख्या !!!
एलिसन

43

गैर-अवरोधक का विचार यह है कि लूप पुनरावृत्तियों त्वरित हैं। तो प्रत्येक टिक के लिए पुनरावृति करने के लिए पर्याप्त समय लेना चाहिए, ताकि सेटटाइमआउट उचित परिशुद्धता (संभवत: <100 एमएस या इतने पर) के भीतर सटीक हो।

सिद्धांत में, हालांकि आप सही हैं। अगर मैं एक एप्लिकेशन लिखता हूं और टिक को ब्लॉक करता हूं, तो सेटटाइमआउट में देरी होगी। तो जवाब देने के लिए आप सवाल कर रहे हैं, कौन सेट टाइमआउट को समय पर निष्पादित करने का आश्वासन दे सकता है? आप गैर-अवरोधक कोड लिखकर सटीकता की डिग्री को लगभग किसी भी उचित सटीकता की डिग्री तक नियंत्रित कर सकते हैं।

जब तक जावास्क्रिप्ट कोड निष्पादन के मामले में "सिंगल-थ्रेडेड" है (वेब-वर्कर्स और इस तरह को छोड़कर), हमेशा ऐसा होगा। एकल-थ्रेडेड प्रकृति अधिकांश मामलों में एक विशाल सरलीकरण है, लेकिन सफल होने के लिए गैर-अवरुद्ध मुहावरे की आवश्यकता होती है।

इस कोड को अपने ब्राउज़र या नोड में देखें, और आप देखेंगे कि सटीकता की कोई गारंटी नहीं है, इसके विपरीत, सेटटाइमआउट बहुत देर हो जाएगी:

var start = Date.now();

// expecting something close to 500
setTimeout(function(){ console.log(Date.now() - start); }, 500);

// fiddle with the number of iterations depending on how quick your machine is
for(var i=0; i<5000000; ++i){}

जब तक दुभाषिया लूप को दूर कर देता है (जो क्रोम पर नहीं है), तो आपको हजारों में कुछ मिलेगा। लूप निकालें और आप देखेंगे कि यह नाक पर 500 है ...


9

कोड को निष्पादित करने का एकमात्र तरीका एक अलग प्रक्रिया में अपने सेटटाइमआउट तर्क को रखना है।

एक नए नोड.जेएस प्रोग्राम को स्पॉन करने के लिए चाइल्ड प्रोसेस मॉड्यूल का उपयोग करें जो आपके तर्क और डेटा को किसी तरह की स्ट्रीम (शायद टीसीपी) के माध्यम से पास करता है।

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

आगे की जटिलता एक हार्डवेयर स्तर पर है जहाँ आपके पास अधिक थ्रेड चल रहे हैं फिर प्रक्रियाएं और इस प्रकार संदर्भ स्विचिंग आपके अपेक्षित समय से देरी (बहुत मामूली) का कारण होगा। यह नगण्य होना चाहिए और अगर यह मायने रखता है कि आपको गंभीरता से विचार करने की आवश्यकता है कि आपकी कोशिश क्या है, तो आपको इस तरह की सटीकता की आवश्यकता क्यों है और इसके बजाय काम करने के लिए किस प्रकार का वास्तविक समय वैकल्पिक हार्डवेयर उपलब्ध है।

सामान्य रूप से बच्चे की प्रक्रियाओं का उपयोग करके और एक लोड बैलेंसर या साझा डेटा संग्रहण (जैसे रेडिस) के साथ अलग-अलग प्रक्रियाओं के रूप में कई नोड एप्लिकेशन चलाने से आपके कोड को स्केल करने के लिए महत्वपूर्ण है।


9

setTimeoutथ्रेड का एक प्रकार है , यह एक निश्चित समय के लिए एक ऑपरेशन रखता है और निष्पादित करता है।

setTimeout(function,time_in_mills);

यहाँ पहला तर्क एक फ़ंक्शन प्रकार होना चाहिए; एक उदाहरण के रूप में यदि आप 3 सेकंड के बाद अपना नाम प्रिंट करना चाहते हैं, तो आपका कोड नीचे जैसा होना चाहिए।

setTimeout(function(){console.log('your name')},3000);

याद रखने की मुख्य बात यह है कि आप कभी भी setTimeoutविधि का उपयोग करके क्या करना चाहते हैं , इसे किसी फ़ंक्शन के अंदर करें । यदि आप कुछ मापदंडों को पार्स करके किसी अन्य विधि को कॉल करना चाहते हैं, तो आपका कोड नीचे की तरह दिखना चाहिए:

setTimeout(function(){yourOtherMethod(parameter);},3000);

8

setTimeout(callback,t)कम से कम टी मिलीसेकंड के बाद कॉलबैक चलाने के लिए उपयोग किया जाता है । वास्तविक देरी कई बाहरी कारकों पर निर्भर करती है जैसे ओएस टाइमर ग्रैन्युलैरिटी और सिस्टम लोड।

इसलिए, एक संभावना है कि इसे निर्धारित समय के बाद थोड़ा कहा जाएगा, लेकिन इसे पहले कभी नहीं बुलाया जाएगा।

एक टाइमर 24.8 दिनों से अधिक नहीं चल सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.