Go 通道容量,为什么需要比我指定的多一个元素

Go 通道容量,为什么需要比我指定的多一个元素,go,channel,Go,Channel,如果我更改消息:=makechan string,1//没有缓冲区 我得到 message := make(chan string ,2) // no buffer 为什么2个缓冲区通道可以存储3个字符串对象?不是2 谢谢,它是这样工作的,因为缓冲区在阻塞之前保存了N条消息。当N+1消息传入时,GO将看到它超出了您指定的容量,并且将不得不阻塞,等待从该通道获取某些内容。传递缓冲区大小时,发送方将始终阻止N+1消息 因此,例如大小为2的情况下,您有一个空缓冲区: [][] 然后,一条消息进入,被

如果我更改消息:=makechan string,1//没有缓冲区

我得到

message := make(chan string ,2) // no buffer
为什么2个缓冲区通道可以存储3个字符串对象?不是2


谢谢,

它是这样工作的,因为缓冲区在阻塞之前保存了N条消息。当N+1消息传入时,GO将看到它超出了您指定的容量,并且将不得不阻塞,等待从该通道获取某些内容。传递缓冲区大小时,发送方将始终阻止N+1消息

因此,例如大小为2的情况下,您有一个空缓冲区:

[][]

然后,一条消息进入,被放入缓冲区:

[m1][]

然后另一个,我们可以继续,因为缓冲区中有空间

[m1][m2]

然后另一个进来了,我们的缓冲区没有更多的空间,所以我们阻塞了

[m1][m2]m3->区块

像这样的

大小基本上是可以在不阻塞的情况下发送到缓冲区的消息数

对于未来,我推荐

一旦MaxUnderstand处理程序正在执行该进程,任何其他处理程序都将执行 块尝试发送到已填充的通道缓冲区,直到 现有处理程序完成并从缓冲区接收数据


它是这样工作的,因为缓冲区在阻塞之前保存了N条消息。当N+1消息传入时,GO将看到它超出了您指定的容量,并且将不得不阻塞,等待从该通道获取某些内容。传递缓冲区大小时,发送方将始终阻止N+1消息

因此,例如大小为2的情况下,您有一个空缓冲区:

[][]

然后,一条消息进入,被放入缓冲区:

[m1][]

然后另一个,我们可以继续,因为缓冲区中有空间

[m1][m2]

然后另一个进来了,我们的缓冲区没有更多的空间,所以我们阻塞了

[m1][m2]m3->区块

像这样的

大小基本上是可以在不阻塞的情况下发送到缓冲区的消息数

对于未来,我推荐

一旦MaxUnderstand处理程序正在执行该进程,任何其他处理程序都将执行 块尝试发送到已填充的通道缓冲区,直到 现有处理程序完成并从缓冲区接收数据

send message
send message  [wait for 3 sec]
message 1
send message
message 2
message 3
message := make(chan string ,2) // no buffer
send message
send message
send message [wait 3 sec]
message 1
message 2
message 3
var sem = make(chan int, MaxOutstanding)