Go 语言并发编程指南
+
什么是并发编程
并发编程是指程序中包含多个独立的执行流,它们可以同时运行并协同工作。Go 语言从设计之初就对并发提供了原生支持。
Goroutine
Goroutine 是 Go 语言中最基本的并发单元。它是由 Go 运行时管理的轻量级线程。
package main
import (
"fmt"
"time"
)
func sayHello(name string) {
for i := 0; i < 5; i++ {
fmt.Printf("Hello, %s! (%d)\n", name, i)
time.Sleep(100 * time.Millisecond)
}
}
func main() {
go sayHello("World")
go sayHello("Go")
time.Sleep(1 * time.Second)
}
Channel
Channel 是 goroutine 之间通信的管道。
ch := make(chan int)
// 发送数据
go func() {
ch <- 42
}()
// 接收数据
value := <-ch
fmt.Println(value) // 输出: 42
Select 语句
select 语句让一个 goroutine 可以等待多个通信操作。
select {
case msg1 := <-ch1:
fmt.Println("received", msg1)
case msg2 := <-ch2:
fmt.Println("received", msg2)
case <-time.After(time.Second):
fmt.Println("timeout")
}
总结
Go 的并发模型基于 CSP (Communicating Sequential Processes) 理念:
- Goroutine:轻量级执行流
- Channel:安全的通信机制
- Select:多路复用
不要通过共享内存来通信,而应该通过通信来共享内存。