HeadlinesBriefing favicon HeadlinesBriefing.com

Go 并发精简迷你书概览

Hacker News •
×

本迷你书简要概述了 Go 语言中的许多并发主题。每个主题都配有交互式示例——欢迎修改代码并点击运行进行实验。还有一个 PDF 版本,包含静态示例。这是关于 Go 并发的快速复习,而不是初学者指南。如果你想通过实践练习从头开始学习并发,请查看另一本书——《Go 要点:并发》。本书不含人工智能内容。Go 中并发的基础是 goroutine——使用 go 关关键字启动的函数。Go 运行时会协调这些 goroutine,并将它们分配到运行在 CPU 核心上的操作系统线程中。与操作系统线程相比,goroutine 更轻量,因此可以创建数百个或数千个。等待组内部有一个计数器。调用 Add(n) 会将其增加 n,而 Done() 会将其减少 1。Wait() 会阻塞调用的 goroutine,直到计数器达到零。这样,main 会在退出前等待两个 worker 完成。goroutine 可以通过通道彼此传递值。通道就像一个窗口,一个 goroutine 可以扔东西,另一个可以接住。通过通道发送值是一个同步操作。当发送的 goroutine 向通道写入一个值时,它会阻塞并等待有人接收该值。只有这样它才会继续。从函数返回通道并在内部 goroutine 中填充它是一种常见模式。这允许接收者接收值,同时拥有函数保留控制权。关闭通道会向读取者发出所有数据已发送的信号。读取者在读取时使用第二个值“逗号 OK”来检查通道的状态。如果通道已关闭,读取者会得到一个零值和一个 false 状态。通道迭代范围会自动读取下一个值并检查其是否已关闭。如果已关闭,它将退出循环。