2015-07-31 4 views
5

मैं (gotest.go) नीचे परीक्षण कोडगोलांग समय। नींद की बग?

package main 

import (
    "fmt" 
    "time" 
    "sync" 
)   

func main() { 
    var wg sync.WaitGroup 
    wg.Add(1) 
    go testa()  

    wg.Wait() 
} 

func testa() { 
    for { 
     fmt.Println("test goroutine") 
     time.Sleep(2 * time.Second) 
    } 
} 

सांत्वना बनाने

go run gotest.go 

और, बदलने अपने कंप्यूटर की तारीख (पूर्व: 2015/07/30 -> 2015/07/29)

और फिर, println मुद्रित नहीं है !!

क्या यह बग है ??

मैं MacOS नवीनतम ver का उपयोग करें (यह अगले दिन स्थापित करने के लिए काम कर रहा है)। धन्यवाद।

+0

मेरे पास विंडोज मशीन पर ऐसा कोई व्यवहार नहीं है। हो सकता है कि यह यूनिक्स मशीनों पर एक बग है, उदाहरण के लिए समय पर समय की तुलना का उपयोग करें। नींद समारोह – RoninDev

उत्तर

5

आंतरिक नींद पूर्ण समय के साथ किया जाता है: यदि आप समय T कार्यक्रम के बादn समय को जगाने के लिए नहीं निर्धारित है पर Sleep(n) फोन, लेकिन समय T + n पर।

यह आम तौर पर पसंद किया जाता है क्योंकि:

  • समय आमतौर पर

    कारण ओएस शेड्यूलिंग
  • पीछे की ओर प्रवाहित नहीं होता एक प्रोग्राम है जो बार-बार सोता है अनिश्चित काल के लिए निर्धारित समय से पीछे अंतराल हो सकता है विलंब; पूर्ण समय का उपयोग करके इसे छोटे अंतराल के लिए सोने से देरी के लिए क्षतिपूर्ति करनी पड़ती है।

आपके मामले में, आपको प्रोग्राम को फिर से प्रिंट करना शुरू करने के लिए एक दिन का इंतजार करना होगा। : डी

या अतीत में थोड़ा सा समय निर्धारित करें (15 सेकंड कहें), और कार्यक्रम 15 + 2 सेकंड के बाद फिर से शुरू करें।

पीएस। उदाहरण के साथ क्या होता है यह स्पष्ट करने के लिए:

2016-08-25 16:27:12 कार्यक्रम time.Sleep(2 * time.Second) गो रनटाइम गोरौटाइन को 2016-08-25 को 16:27:14 तक जागने के लिए शेड्यूल करता है और कहते हैं goroutine सोने के लिए

इस बीच ...

उपयोगकर्ता 2016-08- 16:27:13

समय अब ​​समाप्त हो एक दिन समाप्त होने पर निर्धारित किया गया है करने के लिए सेट सिस्टम का समय और एक सेकंड बाद में।

यह सिस्टम पर नहीं होना चाहिए, जिस पर गो POSIX CLOCK_MONOTONIC या उसके समकक्ष का उपयोग करता है।

+1

आपकी टिप्पणी के लिए धन्यवाद! – user2139281

+0

लेकिन यह सच नहीं है, या मुझे कुछ याद आती है? यहां 'समय' के लिए दस्तावेज़ हैं। नींद ': (https://golang.org/pkg/time/#Sleep) _Sleep कम से कम अवधि डी के लिए वर्तमान goroutine को रोकता है। एक नकारात्मक या शून्य अवधि तुरंत नींद वापस लौटने का कारण बनती है –

+0

मैंने सत्यापित किया और 'समय। सो जाओ (1 * समय।दूसरा) 'वास्तव में मेरे goroutine 1 सेकंड के लिए सोने के लिए डालता है। –

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