为什么goroutines比其他语言的线程便宜得多?

时间:2017-01-28 04:32:48

标签: go goroutine

在他的演讲中 - https://blog.golang.org/concurrency-is-not-parallelism,Rob Pike说,惯例与线程相似但便宜得多。有人可以解释原因吗?

1 个答案:

答案 0 :(得分:4)

请参阅" How goroutines work"。
它们更便宜:

  • 记忆消耗:
    线程以大内存开头而不是几个Kb。
  • 设置和拆卸成本
    (这就是为什么你必须维护一个线程池)
  • 转换成本
    线程是预先安排的,在线程切换期间,调度程序需要保存/恢复所有寄存器 与运行时管理goroutine的Go相反,从创建到调度再到拆卸。并且要保存的寄存器数量较少。

另外,正如" Go’s march to low-latency GC"中提到的,当运行时负责管理goroutines时,GC更容易实现:

  

自从在Go 1.5中引入并发GC以来,运行时一直在跟踪goroutine自上次扫描堆栈以来是否已执行。标记终止阶段将检查每个goroutine以查看它是否最近运行,并将重新扫描少数。

     

在Go 1.7中,运行时维护了一个单独的这类goroutine的简短列表。这样就无需在用户代码暂停时查看整个goroutine列表,并大大减少了可触发内核与NUMA相关的内存迁移代码的内存访问次数。