Golang协程之了解管道的缓存能力

Golang协程之了解管道的缓存能力

我们之前讲过,当使用make建立管道时,第二个参数为零,就证明这个管道是无缓存能力的管道。只要没人写就永远读不出来,只要没人读就google永远写不进去。例如:

ch := make(chan int,0)

管道的缓冲区能被初始化为指定的缓冲区容量。 如果为零,或者省略了大小,则该通道是缓存视频变成本地视频无缓冲的。

如果将第二个参数改为8(这里可以为任意大小),这就说明缓存能力为8,即使不读,也能写缓存视频怎样转入本地视频入8个元素工商银行客服电话

package main
impo缓存视频怎样转入相册rt (
"fmt"
"t缓存视频合并app下载ime"
)
func main() {
//The channGoel's buffer is initialized with the specified龚俊 buffer capacity.
//If zero, or the size is omitted, the channel is unbuffe工商银行客服电话red.缓存
ch := make(chan int,0)
go func() {
ch <- 123
fmt.Println("数据已写入")
}()
go func() {
time.S缓存leep(2*time.Second缓存数据可以清除吗)
x:= <- ch
fmt.Println("数据已读出",x)
}()
time.Sleep(5*time.Second)
fmt.Println("Game Over!")
}

这段代码在运行过程中,由于一条协程在写入管道缓冲区,另一条协程在读取管道的缓冲区,但是读取管道缓冲区的那条协程会sleep 两缓存秒,所以在前两秒另一条写入缓存视频怎样转入相册管道缓冲区的协程也不能写入。

如果让写入管道缓冲区的那条协枸杞程sleep两秒,缓存那么前两秒另一条读取管道宫颈癌疫苗缓冲区的协程也不能读取数据。

如果一个缓冲区大小为3的管道,写入4个值,那么第4个值就写入不了,运行结果是这样的:

写入1
写入2
写入3

下面我们来看一看管道内的元素个数及它的缓存能力吧:

packag缓存是什么意思e main
import (
"fmt"
"time"
)
func main101() {
ch := make(c龚俊han int,3)
go func() {
ch <- 1
fmt.Pr缓存intln("写入1")
ch <龚俊- 2
fmt.Println("写入2缓存是什么意思")
ch <- 3
fmt.Printl缓存n("写入3")
//管道的缓冲区已经存满,不能再写入!
ch <-缓存数据可以清除吗 4
fmt.Println("写入4")
}()
time.Sleep(5 * time.Second)
}
func main() {
ch := make(chan int,3)
fm缓存t.Print公积金ln缓存视频怎么下载到手机相册("元素的个数为",len(ch),"缓存能力为",cap(ch));
ch <- 123
fmt.Println("元素的个数为",len(ch),"缓存能力为",cap(ch));
ch <缓存视频合并- 123
fmt.Println("元素的个数为",le缓存的视频怎么保存到本地n(ch),"缓存能力为",cap(ch))宫颈癌;
ch <- 123
fmt.PrintlnGo("元素的个数为",len(ch),"缓存能力为",cap(ch));
}

运行结果是

元素的个数为 0 缓存能力为 3
元素的个缓存视频在手机哪里找数为 1 缓存能力为 3
元素的个数为 2 缓存能力为 3
元素的个数为 3 缓存能力为 3
fatal error: all goroutines are asleep - deadlock宫颈癌疫苗!
goroutine 1 [chan send]:
main.main()
E:/main.go:36 +0x4e5
Process finished with exit code 2

我们可以看到管道的缓存能力是没有变化的,但是存入的元素个数是在变化的。

我们可以看到这里出现了死锁,这里主协程永远无法继续执行。

我们再来了解一下管道的有关知识。

据了解缓存,管道是建立在堆上面的。使用make函数Go返回的是指针缓存视频怎么下载到手机相册,这就是为什么我们能够在函数之间传递管道,不需要传递指向管道的指针。

ch := make(chan int,0)

使用make创建一个管道只能传输同一类型缓存视频变成本地视频的数据,建立一个管道时需要指定一个数据类型,不允许通过一个管道传输多种类型的数据。