2013-12-12 9 views
7

libuv में, आप कार्यकर्ता धागे को बहुत अधिक काम या छोटी गाड़ी कोड के साथ जोड़ना समाप्त कर सकते हैं। क्या कोई साधारण कार्य है जो कार्यकर्ता थ्रेड या थ्रेड कतार के स्वास्थ्य की जांच कर सकता है? यह 100% निर्धारक नहीं होना चाहिए, आखिरकार यह निर्धारित करना असंभव होगा कि कार्यकर्ता धागा धीमी कोड या अनंत लूप पर लटक रहा है या नहीं।libuv कार्यकर्ता धागे या काम कतार स्वास्थ्य जांच?

तो निम्नलिखित heuristics के किसी भी अच्छा होगा:

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

  • क्या libuv के पास कोई थ्रेड हत्या तंत्र है जहां कार्यकर्ता धागा एन सेकेंड में वापस नहीं देखता है, तो इसे समाप्त कर दिया जाता है?

+0

क्या आप libode का उपयोग node.js ऐप या स्टैंडअलोन के हिस्से के रूप में कर रहे हैं? –

उत्तर

1

यह फ़ंक्शन libuv में मौजूद नहीं है, और मुझे किसी भी ओएसएस से अवगत नहीं है जो ऐसा कुछ प्रदान करता है।

एक हत्या तंत्र के संदर्भ में, वहाँ कोई भी libuv में शामिल किया हुआ है, लेकिन http://nikhilm.github.io/uvbook/threads.html#core-thread-operations पता चलता है:

एक अच्छी तरह से डिजाइन कार्यक्रम लंबे समय से समाप्त करने के लिए एक तरह से श्रमिकों कि पहले से ही क्रियान्वित करने शुरू कर दिया है चल रहा होगा। ऐसा कार्यकर्ता समय-समय पर एक चर के लिए जांच सकता है कि केवल मुख्य प्रक्रिया सिग्नल समाप्ति पर सेट होती है।

-1

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

एक मॉनिटर थ्रेड स्वयं को फिर से कतार कर सकता है और जांच सकता है कि इसे कॉल किया जाता है कम से कम हर 10 मिलीसेकंड (या जो भी अधिकतम संचयी अवरुद्ध एमएस की अनुमति है)। चूंकि नोडज थ्रेड राउंड-रॉबिन चलाता है, अगर मॉनीटर थ्रेड समय पर चल रहा था, तो यह हमें बताता है कि अन्य सभी धागे को उसी 10 एमएस विंडो में चलाने का मौका मिला है। (नोड में) की तरह कुछ:

// like Date.now(), but with higher precision 
// the extra precision is needed to be able to track small delays 
function dateNow() { 
    var t = process.hrtime(); 
    return (t[0] + t[1] * 1e-9) * 1000; 
} 

var _lastTimestamp = dateNow(); // when healthMonitor ran last, in ms 
var _maxAllowedDelay = 10.0;  // max ms delay we allow for our task to run 
function healthMonitor() { 
    var now = dateNow(); 
    var delay = now - _lastTimestamp; 
    if (delaly > _maxAllowedDelay) { 
     console.log("healthMonitor was late:", delay, " > ", _maxAllowedDelay); 
    } 
    _lastTimestamp = now; 
    setTimeout(healthMonitor, 1); 
} 

// launch the health monitor and run it forever 
// note: the node process will never exit, it will have to be killed 
healthMonitor(); 

अलर्ट संदेश थ्रॉटलिंग और एक साफ बंद का समर्थन कर एक व्यायाम पाठक के लिए छोड़ दिया है।

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