Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?

本文探讨Go面试中关于Goroutine数量是否越多越好的问题。Goroutine是Go语言的轻量级线程,调度由GMP模型管理。过多的Goroutine不会直接限制数量,但可能影响GC和调度,如内存消耗和系统线程限制。合理的Goroutine数量应考虑系统资源和具体任务需求,避免资源浪费和性能问题。

Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?

前言

现在的大厂都开始慢慢使用Go语言了,例如字节已经把Go作为后端开发的主要编程语言。但是Go的面试题总结的比较少,于是打算开启这个专栏,一起学习一起进步。


前几天被问到一个问题:“单机的 goroutine 数量控制在多少比较合适?”。

第一反应一样是答复 “控制多少,我觉得没有定论”。

紧接着延伸出了更进一步的疑惑:“goroutine 太多了会影响 gc 和调度吧,主要是怎么预算这个数是合理的呢?

这是本文要进行探讨的主体,因此本文的结构会是先探索基础知识,再一步步揭开,深入理解这个问题。

Goroutine 是什么

Go 语言作为一个新生编程语言,其令人喜爱的特性之一就是 goroutine。Goroutine 是一个由 Go 运行时管理的轻量级线程,一般称其为 “协程”。

go f(x, y, z)

操作系统本身是无法明确感知到 Goroutine 的存在的,Goroutine 的操作和切换归属于 “用户态” 中。

Goroutine 由特定的调度模式来控制,以 “多路复用” 的形式运行在操作系统为 Go 程序分配的几个系统线程上。

同时创建 Goroutine 的开销很小,初始只需要 2-4k 的栈空间。Goroutine 本身会根据实际使用情况进行自伸缩,非常轻量。

func say(s string) {
 for i := 0; i < 9999999; i++ {
  time.Sleep(100 * time.Millisecond)
  fmt.Println(s)
 }
}

func main() {
 go say("Viper")
 say("你好"
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值