go - 在运行时更新 golang 缓冲通道的容量
问题描述
我正在编写一段代码,其中缓冲通道的容量应该是一个可调参数。即在缓冲通道的第一次初始化之后,如果需要,我想更改通道的容量。
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)
ch = make(chan int, 4)
ch <- 3
ch <- 4
fmt.Println(<-ch)
fmt.Println(<-ch)
fmt.Println(<-ch)
}
以上失败并出现错误致命错误:所有 goroutines 都处于睡眠状态 - 死锁!打印 1,3 和 4 后。
以下代码适用于在更新其容量之前读取通道中的所有值的情况。
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)
ch = make(chan int, 4)
ch <- 3
ch <- 4
fmt.Println(<-ch)
fmt.Println(<-ch)
}
有人可以在这里提供帮助,是否可以在运行时更新缓冲通道容量,同时它仍然具有一些尚未读取的值。
解决方案
有人可以在这里提供帮助,是否可以在运行时更新缓冲通道容量,同时它仍然具有一些尚未读取的值。
这是不可能的。一旦通过 make 构建通道,它就会保持其容量,这在运行时是不可改变的。
推荐阅读
- excel - 从关闭的 SharePoint 文件读取的 Excel VBA 不起作用
- javascript - 在画布JavaScript中将多色图像转换为单色图像
- python - 如何在 keras 中使用“sample_weight”
- mongodb - Mongoose 指定可选的对象数组
- sql - 使用嵌入式 CURSOR 查询 - 错误是什么?
- excel - 过滤条件 1 和条件 2 在日期列上未定义
- r - 检查期间未找到导出的 S3 方法
- typescript - 无法使用 web-assembly rust impl,因为“初始化前无法访问 '__wbindgen_throw'”错误
- html - 从使用 jquery 的文本文件创建的选择下拉列表中捕获选定的项目值
- sql - AWS EMR 上的 Hive - 发送“计数 (*)”时出错