zoukankan      html  css  js  c++  java
  • 缓冲信道

    缓冲信道

    非缓冲信道是一个进一个出,再一个进再一个出,信道内是不保存数据的;

    缓冲信道是可以很多个依次进去,存储在信道里,然后一个一个的按次序取出来。

    package main
    
    import "fmt"
    
    func main(){
        var a chan int = make(chan int,3)
        a <-1
        a <-2
        a <-3
        fmt.Println("缓冲信道")
    }

    长度与容量

    长度是表示里面有几个值

    容量是表示最多能存放几个值

    package main
    
    import "fmt"
    
    func main() {
        var a =make(chan int ,4)
        a<-1
        a<-2
        fmt.Println(len(a)) // 打印结果:2
        fmt.Println(cap(a))  //:4
        <-a
        fmt.Println(len(a))  //:1
        fmt.Println(cap(a))  //:4
    }

    WaitGroup

    WaitGroup 用于实现工作池,它就是等待所有Go协程完成

    func test6(wg *sync.WaitGroup,i int)  {
        time.Sleep(time.Second*2)
        fmt.Println(i)
        wg.Done()
    
    }
    
    func main() {
        //sync包下的WaitGroup,是个值类型,当参传递,需要取地址
        var wg sync.WaitGroup
        for i:=0;i<5;i++{
            //wg.Add表示标志了起了一个goroutine
            wg.Add(1)
            go test6(&wg,i)
        }
        //等待所有协程执行完成
        wg.Wait()
        fmt.Println("都执行完了")
    }

    工作池的实现

    缓冲信道的重要应用之一就是实现[工作池]。

    一般而言,工作池就是一组等待任务分配的线程。一旦完成了所分配的任务,这些线程可继续等待任务的分配。

    工作池的核心功能如下:

    • 创建一个 Go 协程池,监听一个等待作业分配的输入型缓冲信道。
    • 将作业添加到该输入型缓冲信道中。
    • 作业完成后,再将结果写入一个输出型缓冲信道。
    • 从输出型缓冲信道读取并打印结果。
  • 相关阅读:
    js中split字符串分割
    获取日期,实时显示当前时间,时间相减
    5.5.4 函数内部属性
    单选按钮radio和下拉选择select,ajax返回数据回显对应值
    如何在HTML不同的页面中,共用头部与尾部?
    android-Activity(四大组件之一)
    android-ImageView及其子类
    android-ActionBar
    android- 菜单
    android-Fragment
  • 原文地址:https://www.cnblogs.com/xiongying4/p/12037213.html
Copyright © 2011-2022 走看看