缓冲信道

缓冲信道

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

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

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

猜你喜欢

转载自www.cnblogs.com/xiongying4/p/12037213.html