go - Go select如何决定运行到默认分支?
问题描述
我有一个程序,其中有 256 个 goroutines 生成测试数据并将它们发送到一个通道。
在程序的消费部分,我设置了一个这样的选择:
select {
case c := <-theChan:
// Do some stuff with c
default:
//
}
令我惊讶的是,虽然 256 个 goroutine 不断向通道发送项目并且项目的处理需要时间?该程序多次运行到default
分支中。
我想知道该select
语句如何确定theChan
为空并遇到default
.
解决方案
这取决于调度程序,但是在您从通道消耗一个值的时间和另一个 goroutine 获得调度程序分配的执行时间(这将在通道中添加一个值)之间,主 goroutine 可能有足够的时间来运行case 并返回到将select
值添加到通道之前的语句,然后它将运行该default
案例。
您可以通过使用缓冲通道来减少这种情况。
推荐阅读
- protractor - Angular 应用程序的量角器:E/启动器进程退出,错误代码为 199 - Chrome 挂断数据:
- mysql - Mysql用汇总和注释表
- tensorflow - 我的归一化数据集在 0 和 1 之间的好 MSE 和 RMSE 是什么
- graphql - Gatsby - 使用 createRemoteFileNode 获取远程图像
- sql-server-2008 - 优化 SQL - 在变量存在时为 JOINS 和混乱换出函数
- r - R:在ggtitle的标题中使用希腊字母
- javascript - 两个输入没有在表单 React js 上提交两个值
- jenkins - 你可以重命名主节点吗?
- r - tidyverse:因子的每个级别的方差分析
- python - 熊猫:从长到宽投射/旋转多列?