2014-06-26 22 views
7

Tôi đang học Go và tôi muốn thử các kênh và kênh.Tại sao goroutine của tôi không được thực thi?

Dưới đây là mã của tôi:

package main 
import "fmt" 
func main(){ 

messages := make(chan string,3) 

messages <- "one" 
messages <- "two" 
messages <- "three" 

go func(m *chan string) { 
    fmt.Println("Entering the goroutine...") 
    for { 
     fmt.Println(<- *m) 
    } 
}(&messages) 

fmt.Println("Done!") 
} 

Và đây là kết quả:

Done! 

Tôi không hiểu tại sao goroutine của tôi là không bao giờ thực hiện. "Enter the goroutine" không được in và tôi không có bất kỳ thông báo lỗi nào.

Trả lời

15

Thực tế là goroutine của bạn bắt đầu, nhưng kết thúc trước khi làm bất cứ điều gì bởi vì chương trình của bạn ngừng hoạt động ngay sau khi in Done!: thực hiện goroutines là độc lập của chương trình chính, nhưng sẽ được dừng lại ở giống như chương trình. Vì vậy, về cơ bản, bạn cần một số quá trình để làm cho chương trình chờ đợi cho họ. Có thể là một kênh khác đang chờ một số tin nhắn, một số sync.WaitGroup hoặc các thủ thuật khác.

Bạn nên đọc xuất sắc post about concurrency in go trong blog golang.

5

Goroutine của bạn không có đủ thời gian để thực thi, vì chức năng chính thoát sau khi in Done!.

Bạn cần làm điều gì đó để làm cho chương trình chờ Goroutine.

Cách dễ nhất là thêm time.Sleep() vào cuối.

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 

    messages := make(chan string, 3) 

    messages <- "one" 
    messages <- "two" 
    messages <- "three" 

    go func(m *chan string) { 
     fmt.Println("Entering the goroutine...") 
     for { 
      fmt.Println(<-*m) 
     } 
    }(&messages) 
    time.Sleep(5 * time.Second) 
    fmt.Println("Done!") 
} 

Bước vào goroutine ...
một
hai
ba
Xong!

Playground

Trong khi làm việc này, nó khuyến khích sử dụng các kênh truyền hình, hoặc các chức năng từ gói sync, ngoài goroutines, để đồng bộ hóa đang đồng thời.

Ví dụ:

package main 

import (
    "fmt" 
) 

func main() { 

    messages := make(chan string, 3) 
    go func(m chan string) { 
     defer close(m) 
     fmt.Println("Entering the goroutine...") 
     messages <- "one" 
     messages <- "two" 
     messages <- "three" 
    }(messages) 
    for message := range messages { 
     fmt.Println("received", message) 
    } 
    fmt.Println("Done!") 
} 

Bước vào goroutine ...
nhận được một
nhận được hai
nhận được ba
Xong!

Playground

+1

Công trình ngủ, nhưng là giải pháp tồi tệ nhất có thể. Nó là bên cạnh vô dụng trong các tình huống thực tế. – Elwinar

+0

@Elwinar, vâng, nhưng nó chứng tỏ tại sao OP không nhìn thấy những gì họ mong đợi. – Intermernet

Các vấn đề liên quan