GO语言练习:channel 缓冲机制

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)主线程等待的时间到了,返回,退出