安裝Golang
sudo yum install golang
go1.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
傳遞取消信號或超時控制。參考資料: