缓冲信道

Posted 对未来最大的慷慨,是把一切献给现在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓冲信道相关的知识,希望对你有一定的参考价值。

缓冲信道

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

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

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 协程池,监听一个等待作业分配的输入型缓冲信道。
  • 将作业添加到该输入型缓冲信道中。
  • 作业完成后,再将结果写入一个输出型缓冲信道。
  • 从输出型缓冲信道读取并打印结果。

以上是关于缓冲信道的主要内容,如果未能解决你的问题,请参考以下文章

Go语言的并发(多线程协程)通道(信道)缓冲信道(Buffer Channels)长度和容量

java缓冲字符字节输入输出流:java.io.BufferedReaderjava.io.BufferedWriterjava.io.BufferedInputStreamjava.io.(代码片段

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

为啥在 Metal 中不允许从片段着色器中写入缓冲区?

帧缓冲纹理出现白色(片段着色器不影响它)

OpenGL 片段着色器未写入 fbo 颜色缓冲区