在Go語言中,有效的并發管理主要依賴于以下幾個方面:
go
。Channels是Goroutines之間進行通信的管道。通過使用Channels,你可以在不同的Goroutines之間傳遞數據,從而實現同步和數據共享。func worker(done chan bool) {
fmt.Println("working...")
done <- true
}
func main() {
done := make(chan bool, 1)
go worker(done)
<-done
fmt.Println("finished")
}
import "sync"
var counter int
var lock sync.Mutex
func increment() {
lock.Lock()
defer lock.Unlock()
counter++
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
wg.Wait()
fmt.Println("Counter:", counter)
}
WaitGroups:WaitGroup用于等待一組Goroutines完成。當你啟動一個新的Goroutine時,可以使用wg.Add(1)
增加計數器。在每個Goroutine完成時,使用wg.Done()
減少計數器。在主函數中,使用wg.Wait()
阻塞,直到所有Goroutines完成。
Context:Context用于在多個Goroutines之間傳遞截止時間、取消信號和其他請求范圍的值。這對于控制長時間運行的任務和優雅地終止它們非常有用。
import (
"context"
"fmt"
"time"
)
func task(ctx context.Context, id int) {
for {
select {
case <-ctx.Done():
fmt.Printf("Task %d cancelled\n", id)
return
default:
fmt.Printf("Task %d working\n", id)
time.Sleep(1 * time.Second)
}
}
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
for i := 1; i <= 3; i++ {
go task(ctx, i)
}
<-ctx.Done()
fmt.Println("All tasks cancelled")
}
總之,Go語言提供了強大的并發支持,通過合理地使用Goroutines、Channels、同步原語、WaitGroups、Context以及選擇合適的并發模式,你可以有效地管理并發編程。