为什么Go Channel的缓冲区不能正确限制写入/读取?

php小编柚子在这篇文章中将解答一个常见问题:“为什么Go Channel的缓冲区不能正确限制写入/读取?”在Go语言中,Channel是一种用于协程之间通信的机制。当我们使用带有缓冲区的Channel时,期望能够通过限制写入或读取操作的数量来控制程序的行为。然而,实际上,Channel的缓冲区并不能直接限制写入/读取操作的数量。下面将详细阐述这个问题的原因和解决方案。,我正在尝试使用通道在两个 go 例程之间进行通信。首先,我创建了整数通道,然后将其作为参数传递给 go 例程,该例程打印从 0 到 10 的数字序列。这些程序的输出没有意义。,这是主要代码:,对于该代码执行,我得到了以下输出:,请注意,有两次写入执行,然后是两次读取执行。,后来,我设置了一个缓冲区大小来实现如下功能:,然后,得到以下输出:,请注意,现在我们有 5 个写入执行,然后有 5 个读取执行。,一旦我们有了代码和输出,最后一个问题就来了:为什么这些执行的行为是这样的?首先,它不是应该每次只读取和写入一个数字吗?除此之外,为什么第二次执行每次读取和写入 5 个数字而不是 3 个(因为这是缓冲区大小)?,当打印消息时以及何时从通道读取或写入数字时,您会混淆。,当写入发生时,不会发生“写入”消息。它们发生在写入之间的某个时刻。同样,“正在阅读”消息发生在读取之间的某个时刻。,这是安排第一个代码片段的一种方法,它会产生显示的输出:,主要尝试读取,然后阻塞。
工作人员打印“Writing 0”。
Worker 写入 0,main 读取。
工人打印“Writing 1”。
工作线程尝试写入 1,但被阻止。
主要打印“Reading 0”。
主要内容为 1。
主要印刷品“阅读1”。
主要尝试读取,然后阻塞。,Control 像这样在 main 和 Worker 之间不断传递,每个在阻塞之前打印 2 条消息。,同样,您的第二个片段也可以这样安排:,主要尝试读取,然后阻塞。
Worker 打印“Writing 0”,并将 0 直接发送到 main。
Worker 打印“Writing 1”,并缓冲 1。
Worker 打印“Writing 2”,并缓冲 2。
Worker 打印“Writing 3”,并缓冲 3。
工作线程打印“Writing 4”,并阻止尝试发送 4。
main 完成被阻塞的读取,并打印“Reading 0”。
main 读取缓冲的 1,并打印“Reading 1”。
main 读取缓冲的 2,并打印“Reading 2”。
main 读取缓冲的 3,并打印“Reading 3”。
main 读取 Worker 被阻塞的 4,并打印“Reading 4”。
主要尝试读取,然后阻塞。
执行返回到 Worker…,
返回顶部
跳到底部

Copyright 2011-2024 南京追名网络科技有限公司 苏ICP备2023031119号-6 乌徒帮 All Rights Reserved Powered by Z-BlogPHP Theme By open开发

请先 登录 再评论,若不是会员请先 注册