2013-04-26 8 views
42

मैं निम्नलिखित कोड है: जो है मैं क्या होने की अपेक्षाएक goroutine के अंदर fmt.Println क्यों एक लाइन मुद्रित करता है?

package main 

import "net" 
import "fmt" 
import "bufio" 

func main() { 
    conn, _ := net.Dial("tcp", "irc.freenode.net:6667") 

    reader := bufio.NewReader(conn) 
    go func() { 
     str, err := reader.ReadString('\n') 
     if err != nil { 
      // handle it 
      fmt.Println(err) 
     } 
     fmt.Println(str) 
    }() 

} 

मैं कोड है कि एक goroutine में बफर से पढ़ता है की जरूरत नहीं है, तो यह इस प्रकार का संदेश, आउटपुट:

:zelazny.freenode.net NOTICE * :*** Looking up your hostname... 

हालांकि, इसे एक goroutine प्रिंट के अंदर कुछ भी नहीं है।

कोई बता सकता है कि ऐसा क्यों है?

उत्तर

50

main() फ़ंक्शन समाप्त होने पर आपका प्रोग्राम बाहर निकल जाएगा। इससे पहले कि आपके goroutine को चलाने और उसके आउटपुट को मुद्रित करने का समय हो।

एक विकल्प एक चैनल से मुख्य गोराउटिन ब्लॉक पढ़ने के लिए होगा, और जब यह अपना काम पूरा कर लेता है तो चैनल को गोरौटाइन लिखना होगा।

+1

महान विवरण, जेम्स के लिए धन्यवाद:

यहाँ एक उदाहरण है। मुझे निश्चित रूप से लगता है कि चैनल जो मैं ढूंढ रहा हूं। –

24

एक अन्य आम तरीका जिसे आप goroutines को खत्म करने के लिए इंतजार कर रहे हैं, http://golang.org/pkg/sync/#WaitGroup है। प्रत्येक goroutine शुरू करने के लिए आप waitGroup.Add(1) कर सकते हैं, फिर waitGroup.Done() इसे खत्म होने के बाद goroutine में, और मुख्य waitGroup.Wait() कर सकता है और यह waitGroup.Done() प्रत्येक एड के लिए कॉल किया गया है जब तक यह ब्लॉक करेगा।

+0

साझा करने के लिए धन्यवाद, एरिक। –

-1

जैसा ऊपर बताया गया है कि मुख्य() func goroutine को चलाने का मौका देने से पहले बाहर निकल जाएगा। गोरौटाइन हल्के धागे के रूप में अपने समय पर चलते हैं। चाल को डीबग करने के उद्देश्य से मैं आमतौर पर अपने गोराउटिन के बाद नींद को जोड़ना चाहता हूं, यह काफी लंबा है कि यह मेरी गोरौटीन को खत्म करने देगी।

package main                                     

import (
    "fmt" 
    "time" 
) 

func main() { 
    fmt.Println("Hello gopher!") 
    go print_nums(10) 
    time.Sleep(time.Millisecond * 100) // if i take this line out all i will see is hello and bye gopher! 
    fmt.Println("Bye gopher!") 
} 

func print_nums(num int) { 
    i := 0 
    for i < num { 
    fmt.Println(i) 
    i++ 
    } 
} 
-3

आप (इस 3 सेकंड इंतजार कर रहा है) time.Sleep(3 * time.Second) की तरह एक समय देरी जोड़ने की जरूरत है: यहाँ एक बहुत ही बुनियादी उदाहरण है।

कार्यक्रम समाप्त होने पर गोरौटाइन बंद हो जाता है। मेरे साथ भी ठीक यही समस्या थी।

1

goroutine के अंत में ch चैनल को डेटा लिखें और ch से डेटा को गोरौटाइन से बाहर पढ़ें मुख्य कार्य गोरौटाइन प्रिंट संदेश के लिए प्रतीक्षा कर सकता है।

package main 

import "net" 
import "fmt" 
import "bufio" 

func main() { 
conn, _ := net.Dial("tcp", "irc.freenode.net:6667") 

reader := bufio.NewReader(conn) 
ch := make(chan byte, 1) 
go func() { 
    str, err := reader.ReadString('\n') 
    if err != nil { 
     // handle it 
     fmt.Println(err) 
    } 
    fmt.Println(str) 
    ch <- 1 
    }() 
    <-ch 
} 
संबंधित मुद्दे