這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
直接上代碼:
1. 第一種情況, 如果沒有select{}, main 主線程不會等待coroutine運行,導致coroutine得不到機會運行。
You are requesting eventual scheduling (using the two go statements)
of two goroutines and then you exit main without giving the scheduler
a chance to do anything.
有了select, 程式正常運行。
package mainimport ("fmt" "time")func main() {go func1()go func2()select{}}func func1() { for{ fmt.Println("here1") time.Sleep(10 * time.Minute) }}func func2() { for{ fmt.Println("here2") time.Sleep(10 * time.Minute) }
}
2. coroutine有機會運行,但是會發生死結, fatal error: all goroutines are asleep - deadlock!
The goroutine executing func1 exited, ditto for func2. The main goroutine is blocked with no hope to recover while no other goroutine can be scheduled.
package mainimport ("fmt"//"time")func main() {go func1()go func2()select {}}func func1() {fmt.Println("here1")}func func2() {fmt.Println("here2")}
3. 第三種情況, 正常運行。
package mainimport ("fmt")var c = make(chan int, 2)func main() {go func1()go func2()<-c<-cfmt.Println("ok")}func func1() {fmt.Println("here1")c <- 1}func func2() {fmt.Println("here2")c <- 1}
4. 實現上面的目的的另外一種方法:
var wg sync.WaitGroup var urls = []string{ "http://www.golang.org/", "http://www.google.com/", "http://www.somestupidname.com/", } for _, url := range urls { // Increment the WaitGroup counter. wg.Add(1) // Launch a goroutine to fetch the URL. go func(url string) { // Decrement the counter when the goroutine completes. defer wg.Done() // Fetch the URL. http.Get(url) }(url) } // Wait for all HTTP fetches to complete. wg.Wait()