Go 语言并发编程:Goroutine 与 Channel 实战指南
一、什么是 Goroutine
Goroutine 是 Go 语言中最强大的特性之一,它是一种轻量级的线程,由 Go 运行时管理。与操作系统线程相比,Goroutine 的启动开销极小,内存占用仅约 2KB。
二、Goroutine 基础用法
package main
import (
"fmt"
"time"
)
func sayHello() {
fmt.Println("Hello from Goroutine!")
}
func main() {
go sayHello()
time.Sleep(time.Second)
fmt.Println("Main function done")
}
三、Channel 通道通信
Channel 是 Goroutine 之间通信的管道,遵循"不要通过共享内存来通信,而要通过通信来共享内存"的原则。
package main
import "fmt"
func worker(ch chan int) {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
}
func main() {
ch := make(chan int)
go worker(ch)
for num := range ch {
fmt.Printf("Received: %d
", num)
}
}
四、实战:并发处理任务
package main
import (
"fmt"
"sync"
"time"
)
func processTask(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Task %d started
", id)
time.Sleep(100 * time.Millisecond)
fmt.Printf("Task %d completed
", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go processTask(i, &wg)
}
wg.Wait()
fmt.Println("All tasks completed!")
}
五、最佳实践
- 避免 Goroutine 泄漏:确保每个 Goroutine 都能正常退出
- 使用 context 控制生命周期
- 合理使用 buffered channel
- 使用 sync.WaitGroup 等待并发任务完成
总结
Go 语言的并发模型简洁而强大,掌握 Goroutine 和 Channel 是编写高效并发程序的关键。