Cur*_*ous 2 channel go goroutine
我是Go的新手,我可能会忽略这一点,但为什么Go通道限制在缓冲通道的最大缓冲区大小可以有?例如,如果我制作一个这样的频道
channel := make(chan int, 100)
Run Code Online (Sandbox Code Playgroud)
我不能在没有阻塞的情况下向频道添加超过100个元素,这有什么原因吗?此外,它们无法动态调整大小,因为通道API不支持它.
这似乎限制了语言支持单一机制的通用同步,因为与无界信号相比,它缺乏便利性.例如,可以无限制地增加广义信号量的值.
如果一个程序的一个组件无法跟上它的输入,它需要对系统的其余部分施加压力,而不是让它继续运行并生成数十亿字节的数据,这些数据永远不会被处理,因为系统用完了记忆和崩溃
实际上没有无限缓冲区这样的东西,因为机器对它们可以处理的东西有限制.Go要求您指定缓冲通道的大小,以便您考虑程序实际需要和可以处理的缓冲区大小.如果它确实需要十亿个项目,并且可以处理它们,那么你可以创建一个很大的渠道.但在大多数情况下,缓冲区大小为0或1实际上是需要的.
ben*_*der -5
缓冲区大小是在没有发送阻塞的情况下可以发送到通道的元素数量。默认情况下,通道的缓冲区大小为 0(可以通过 make(chan int) 获得)。这意味着每个发送都会阻塞,直到另一个 goroutine 从通道接收到数据。缓冲区大小为 1 的通道可以容纳 1 个元素,直到发送块,所以你会得到
c := make(chan int, 1)
c <- 1 // doesn't block
c <- 2 // blocks until another goroutine receives from the channel
Run Code Online (Sandbox Code Playgroud)
我建议您查看此内容以获得更多说明: https://rogpeppe.wordpress.com/2010/02/10/unlimited-buffering-with-low-overhead/ http://openmymind.net/Introduction-To-Go-缓冲通道/