zoukankan      html  css  js  c++  java
  • 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)主线程等待的时间到了,返回,退出

  • 相关阅读:
    brew一直卡在Updating Homebrew的解决办法
    ELK5.6.4+Redis+Filebeat+Nginx(CentOS7.4)
    CentOS7.3 ffmpeg安装
    nginx Dockerfile
    pip安装第三方包超时
    logrotate nginx日志切割
    Ansible部署zabbix-agent
    Zabbix主动模式和被动模式
    Zabbix添加监控主机
    Zabbix3.2安装
  • 原文地址:https://www.cnblogs.com/fengbohello/p/4656347.html
Copyright © 2011-2022 走看看