1、代码
2、运行
3、解析
1、代码 buffer.go
1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func readThread(ch chan int) { 9 fmt.Println("read for reading...") 10 for i := range ch { 11 fmt.Println("get i : ", i) 12 if 20 == i { 13 break 14 } 15 time.Sleep(1e8) 16 } 17 fmt.Println("read over...") 18 } 19 20 func main() { 21 ch := make(chan int, 1024) 22 go readThread(ch) 23 time.Sleep(1e9 * 2) 24 for i := 1; i <= 20; i++ { 25 ch <- i 26 } 27 fmt.Println("waitting for reading...") 28 time.Sleep(1e9 * 3) 29 fmt.Println("over...") 30 }
2、运行
1 $ go run buffer.go 2 read for reading... 3 waitting for reading... 4 get i : 1 5 get i : 2 6 get i : 3 7 get i : 4 8 get i : 5 9 get i : 6 10 get i : 7 11 get i : 8 12 get i : 9 13 get i : 10 14 get i : 11 15 get i : 12 16 get i : 13 17 get i : 14 18 get i : 15 19 get i : 16 20 get i : 17 21 get i : 18 22 get i : 19 23 get i : 20 24 read over... 25 over...
3、解析
根据运行结果进行分析:
1)先运行的readThread读线程,读线程已经做好了读的准备,但此时channel中还没有数据,所以阻塞了。等待读动作。
2)主线程中,一次性向channel中写入大量数据,由于有缓冲机制,所以可以一次性的写入多个数据而不会阻塞。当主线程写完了数据,就开始等待读线程的读动作结束。
3)channel中开始有数据,读线程开始读数据,每0.1秒钟读取一个数据,一共读取20次。读取结束了,打印read over。
4)主线程等待的时间到了,返回,退出
有疑问加站长微信联系(非本文作者)