Go Runtime 浅析

在 GDC Sigma 小组为期两个月的实习已告一段落,本人也十分有幸能在实习期间在团队内部完成了三次 Go 语言相关的分享。由于个人的不足,很遗憾没能向组员分享更多深入的内容,但尽管内容粗浅,这三次分享仍在组内起到了很好的科普作用,收获了组员的一致好评。受组员委托,我将把这三次分享上与 Go 运行时有关的内容整理成文,希望更多的人能从中受益。

本文将完整描述本人在三次组内 Go 分享中提及的与 Go 运行时有关的内容。分享初期关于 Go 语言入门的内容将不在此处赘述。

阅读更多

吃了兴奋剂的 Go Channel

为什么?

Channel 是 Go 语言的主要同步和通信原语,它们必须速度快且可扩展。

目标:

  • 令单线程(无竞争)的 Channel 操作更快
  • 令有竞争带缓存(生产者消费者)的 Channel 操作更快
  • 令无阻塞失败操作(如检查 Channel 是否已关闭)更快
  • 令信号量 Channel(chan struct{})更快
  • select 语句更快

非目标:

  • 令 Channel 完全无锁(这会导致实现的复杂度大幅提升且在普通使用场景下变得泵满)
  • 令有竞争的同步 Channel 操作更快。

本文接下来的内容会详细介绍这个设计的细节。

阅读更多

并发、Goroutine 与 GOMAXPROCS

每当有新人加入 Go-Miami 小组的时候,他们总会提到他们有多想学习更多有关 Go 并发模型的东西。似乎并发就像这个语言的大新闻一样。不过,在我第一次听说 Go 时确实如此 – 实际上正是 Rob Pike 的 Go 并发模式这个视频让我确信我需要去学这门语言。

要想理解为什么用 Go 编写并发程序会更加容易而且更难出错,我们首先得了解一个并发程序是什么样的,以及它可能会出现哪些问题。我不会在这篇文章中讨论 CSP(Communicating Sequential Processes,通信顺序进程),尽管它确实是 Go 的 Channel 实现的基础。这篇文章主要讲述一个并发程序会是什么样的、Goroutine 在这之中起着什么样的作用、以及 GOMAXPROCS 环境变量和运行时函数会如何影响 Go 运行时和我们编写的程序的行为。

阅读更多