Go Goroutine 与 Channel 并发入门
wxk1991 Lv5

Go Goroutine 与 Channel 并发入门

Go 的并发模型非常轻量。goroutine 负责并发执行,channel 负责协程之间通信。掌握这两个概念,就能写出很多实用的并发程序。


一、启动 goroutine

1
2
3
4
5
6
7
8
9
10
11
package main

import "fmt"

func main() {
go func() {
fmt.Println("run in goroutine")
}()

fmt.Println("main")
}

go 关键字会启动一个新的 goroutine。需要注意的是,主函数结束后,其他 goroutine 也会随进程退出。


二、使用 channel 等待结果

1
2
3
4
5
6
7
8
9
10
func main() {
done := make(chan string)

go func() {
done <- "ok"
}()

result := <-done
fmt.Println(result)
}

发送和接收会同步阻塞,这让 channel 很适合表达任务完成、结果返回和生产消费关系。


三、带缓冲 channel

1
jobs := make(chan int, 10)

带缓冲 channel 可以暂存一定数量的数据,适合生产者和消费者速度不完全一致的场景。


四、关闭 channel

生产者可以关闭 channel,通知消费者没有更多数据:

1
close(jobs)

消费者可以用 range 持续读取:

1
2
3
for job := range jobs {
fmt.Println(job)
}

五、实践建议

Go 并发写起来很快,但不要滥用 goroutine。每个 goroutine 都应该有明确退出条件。对长期运行的任务,最好配合 context.Context 控制取消,避免泄漏。