缓冲信道
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 }
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.(代码片段