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)主線程等待的時間到了,返回,退出

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM