GO语言练习:channel 缓冲机制

fengbohello · · 1940 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

 


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:fengbohello

查看原文:GO语言练习:channel 缓冲机制

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1940 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传