主頁 | 三上 | 三下 | 四上 | 四下 | 五上 | 五下 | 六上 | 六下 | 作品版 | 內小
假設有這麼一段GO 程式 func disp(i int) { fmt.Printf("current time %v , number %d \n", time.Now(), i) time.Sleep(10 * time.Second) } func main() { for i := 0; i < 10; i++ { disp(i) } } 那麼就會依序顯示出是時間和數字
現在把程式改成用GO routine func disp(i int) { fmt.Printf("current time %v , number %d \n", time.Now(), i) time.Sleep(10 * time.Second) } func main() { for i := 0; i < 10; i++ { go disp(i) } } 就會發現什麼也顯示不出來
增加一列time.Sleep(1 * time.Second)就可以,但是為什麼其他的不行呢?
func disp(i int) { fmt.Printf("current time %v , number %d \n", time.Now(), i) time.Sleep(10 * time.Second) } func main() { for i := 0; i < 10; i++ { go disp(i) } time.Sleep(1 * time.Second) }
如果要讓它能等上10秒,寫成這樣也不行
func say(s int, ch chan int) { fmt.Printf("len %d currtime %v number %d\n", len(ch), time.Now(), s) time.Sleep(10 * time.Second) //發揮不了作用 fmt.Printf("len %d currtime %v number %d\n", len(ch), time.Now(), s) ch <- s } func main() { ch := make(chan int, 3) for i := 0; i < 10; i++ { go say(i, ch) } for { select { case <-ch: // Channel 中有資料執行此區域 fmt.Println("main goroutine finished") return default: // Channel 阻塞的話執行此區域 fmt.Println("WAITING...") time.Sleep(5000 * time.Millisecond) } } }
而且如果把say裡的 ch<-s 往前挪就會出錯了
func say(s int, ch chan int) { fmt.Printf("len %d begin %v number %d\n", len(ch), time.Now(), s) time.Sleep(10 * time.Second) //發揮了作用 fmt.Printf("len %d end %v number %d\n", len(ch), time.Now(), s) } func run(k int, ch chan int) { for i := k * 10; i < 5+k*10; i++ { ch <- i say(i, ch) } close(ch) } func main() { ch := make(map[int]chan int) channels := 5 for k := 0; k < channels; k++ { ch[k] = make(chan int, 2) } for k := 0; k < channels; k++ { go run(k, ch[k]) } for k := 0; k < channels; k++ { for range ch[k] { //just wait } } }這樣就可以同時開5個channels,每一個chanel也會自行運轉
沒有留言:
張貼留言