安装Golang
sudo yum install golanggo1.20.4.linux-amd64.tar.gz),解压至/usr/local,并配置环境变量:echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc
source ~/.bashrc
go version。创建项目目录
mkdir ~/go-concurrency-demo
cd ~/go-concurrency-demo
go mod init demo
Goroutine(轻量级线程)
go关键字启动并发任务:func say(msg string) {
for i := 0; i < 3; i++ {
fmt.Println(msg)
}
}
func main() {
go say("Hello") // 启动goroutine
say("World") // 主线程执行
}
Channel(通道)
func worker(id int, ch chan int) {
for num := range ch {
fmt.Printf("Worker %d received: %d\n", id, num)
}
}
func main() {
ch := make(chan int)
for i := 1; i <= 3; i++ {
go worker(i, ch)
}
for i := 1; i <= 5; i++ {
ch <- i // 发送数据到通道
}
close(ch) // 关闭通道
}
同步机制
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
// 任务1
}()
go func() {
defer wg.Done()
// 任务2
}()
wg.Wait() // 阻塞直到所有goroutine完成
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
counter++
mu.Unlock()
}
生产者-消费者模式
func producer(ch chan int) {
for i := 1; i <= 5; i++ {
ch <- i
}
close(ch)
}
func consumer(ch chan int) {
for num := range ch {
fmt.Println("Consumed:", num)
}
}
func main() {
ch := make(chan int)
go producer(ch)
go consumer(ch)
}
扇出/扇入模式
func process(input int, ch chan int) {
ch <- input * 2
}
func main() {
inputs := []int{1, 2, 3, 4}
ch := make(chan int)
// 扇出:启动多个goroutine处理
for _, v := range inputs {
go process(v, ch)
}
// 扇入:合并结果
for i := 0; i < len(inputs); i++ {
fmt.Println(<-ch)
}
}
检测数据竞争
go run -race main.go
性能分析
import _ "net/http/pprof"
// 在代码中启动HTTP服务
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
go tool pprof分析:go tool pprof http://localhost:6060/debug/pprof/profile
sync.WaitGroup或goroutine池控制并发数量。context.Context传递取消信号或超时控制。参考资料: