Tuesday 15 March 2011

go - why golang sched runs differently when the variable is odd or even? Is it coincidence or doomed? -


मेरे पास गोलांग कोड का एक नमूना है (xx.go):

  पैकेज मुख्य आयात "रनटाइम" func main () {c2: = make (चान इंट) go func () {for v: = range c2 {println ("c2 =", v, "numof routines:", runtime.NumGoroutine () }}} () के लिए i: = 1; i & lt; = 10001; i ++ {c2 और lt; - i //runtime.Gosched ()}}   
  • जब पाश संख्या अजीब है, कहते हैं 10001, कोड सभी नंबरों को आउटपुट करेगा।
  • जब लूप गिनती भी है, तो 10000 कहो, कोड सभी संख्याओं को लेकिन अंतिम आउटपुट देगा! < / Li>

    ऐसा क्यों है?

    मैंने संख्याओं को जितना छोटा किया है, उतना ही 10000 के रूप में, वे सभी उपरोक्त नियमों का पालन करते हैं!

    निम्नानुसार ENV है:

    uname -a: लिनक्स थाउपोनोड 25232 2.6.18-308.16.1.एल 5 # 1 एसएमपी मंगवार 2 अक्टूबर 22:01:43 एडीटी 2012 x86_64 x86_64 x86_64 जीएनयू / लिनक्स

    जाओ संस्करण: जाना संस्करण go1.1 linux / amd64

    मुझे लगता है कि यह जाने वाला कार्यक्रम के साथ कुछ करना है

    मैं कोड इकट्ठा करता हूं:

    जाओ उपकरण 6g -S xx.go & gt; Xx.s

    10000 और 10001 के बीच का अंतर यही है:

      33c33 & lt; 0030 (xx.go: 20) CMPQ AX, $ 10001 --- & gt; 0030 (xx.go: 20) CMPQ AX, $ 10000   

    और, पिछले लेकिन कम से कम नहीं, जब मैं रनटाइम जोड़ता हूं। गोज़ड () , सब कुछ अच्छी तरह से चल रहा है

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

    यदि आपको वास्तव में गोरटिने को निकालने से पहले समाप्त करने की आवश्यकता है, उदाहरण के लिए एक sync.WaitGroup को नियोजित करके, इसे खत्म करने की प्रतीक्षा करें।

    वास्तविक समस्या से असंबंधित, आपका कोड अतिप्रभाव है जटिल और unidiomatic क्या यह कर रहा है के लिए। आप goroutine फ़ंक्शन को फिर से लिख सकते हैं:

      v: = range c2 के लिए {println ("c2 =", v, "numof routines:", runtime.NumGoroutine ())}    

No comments:

Post a Comment