golang select两个channel性能稳定,三个channel时性能会发生抖动,为什么?

golang select两个channel性能稳定,三个channel时性能会发生抖动,为什么?

答题思路
select ---> 让 Goroutine同时等待多个 Channel 可读或者可写 ---> Goroutine ---> 调度器调度 ---> 资源竞争 ---> 不稳定、抖动

在 Go 中,select 语句用于在多个通道操作中进行选择。当有多个通道准备好发送或接收数据时,select 会随机选择一个可用的通道操作执行,当select语句中的通道数量增加时,可能会导致性能方面的变化,尤其是在高并发场景下。

性能稳定与性能抖动的问题通常与调度器和 Goroutine 的调度策略有关。在只有两个通道的情况下,Goroutine 可以在两个通道之间轻松切换,这可以保持较为稳定的性能。

但是,在三个或更多通道的情况下,调度器需要更复杂的调度策略来选择下一个要执行的 Goroutine。这可能导致不同的 Goroutine 之间竞争资源,例如 CPU 时间和内存带宽。在高负载情况下,这种竞争可能导致性能抖动,即执行时间的不稳定性。

此外,如果通道的负载不均衡,例如某个通道的写入速度远快于其他通道,或者某个通道的读取速度远慢于其他通道,也会导致性能抖动。这可能会导致某些 Goroutine 被阻塞,而其他 Goroutine 必须等待更长的时间才能执行。

因此,在编写使用select语句的代码时,需要考虑通道的负载情况以及系统的并发性能。通常情况下,使用有限的通道数量,并确保它们的负载大致相等,可以减少性能抖动的可能性。

(为了提高性能和稳定性,可以考虑使用带有缓冲通道或使用扇入/扇出模式来处理多个通道操作。使用带有缓冲的通道可以减少对通道的频繁操作,而扇入/扇出模式可以将多个通道操作合并为一个操作,减少select 的使用次数。)

go 复制代码
//Select 和 Channel
//select是与switch相似的控制结构,与switch不同的是,select中虽然也有多个case,但是这些case中的表达式必须都是 Channel 的收发操作。下面的代码就展示了一个包含 Channel 收发操作的select结构:

package main

import "fmt"

func main() {
  c := make(chan int, 1)
  quit := make(chan int, 1)
  fibonacci(c, quit)
}

func fibonacci(c, quit chan int) {
  x, y := 0, 1
  for {
    select {
    case c <- x:
      x, y = y, x+y 
    case quit <- y:
      x, y = x+y, y
    case <-quit:
      fmt.Println("quit", x, y)
      return
    case <-c:
      fmt.Println("c", x, y)
      return
    default:
      fmt.Println("default")
      return
    }   
  }
}

参考
https://zhuanlan.zhihu.com/p/564277331
https://worktile.com/kb/p/46336

相关推荐
wafrdggh3 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
一个天蝎座 白勺 程序猿3 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库
天诰6 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
龙腾AI白云6 小时前
仿真到现实(Sim-to-Real)迁移:跨越仿真与现实鸿沟
数据库·机器学习·plotly·知识图谱·tornado
陈希1238 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡8 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
@兽血沸腾9 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
freejackman9 小时前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
.痞老板.10 小时前
mysql初阶--增删改查操作
数据库·mysql
讯捷蓝达14 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器