>本文探討了GO的並發功能,專注於goroutines和頻道。 並發允許似乎同時處理多個任務,儘管不一定同時處理。 GOROUTINE,GO的輕量級線程是使用go
>關鍵字創建的,可以並發操作。渠道促進了goroutines之間的通信和同步,從而啟用數據交換。 發送數據使用ch <- value
,在接收用法value := <- ch
>。
package main import ( "fmt" "math/rand" "os" "strconv" "sync" "time" ) func main() { rand.Seed(time.Now().UnixNano()) concurrency, _ := strconv.Atoi(os.Args[1]) // Get concurrency level from command line if concurrency <= 0 { concurrency = 100 // Default concurrency } progress := make([]int, concurrency) var mu sync.Mutex var wg sync.WaitGroup wg.Add(concurrency) for i := 0; i < concurrency; i++ { go func(idx int) { defer wg.Done() for progress[idx] < 100 { mu.Lock() if progress[idx] >= 100 { mu.Unlock() break } inc := rand.Intn(10) + 1 progress[idx] += inc if progress[idx] > 100 { progress[idx] = 100 } mu.Unlock() time.Sleep(time.Duration(rand.Intn(400)+100) * time.Millisecond) } }(i) } done := make(chan struct{}) go func() { wg.Wait() close(done) }() <-done // Wait for all goroutines to complete fmt.Println("Progress:", progress) }
程序模擬並發任務。 每個Goroutine都會更新其進度,直到完成為止。 MUTEX更新共享的進度值時可確保線程安全性。 waitgroup同步goroutine完成。
>
鍵學習>
go
>該示例突出顯示了用於Goroutine創建和並發處理的關鍵字的使用。 它演示了Goroutines如何同時處理多個進度指標。 進一步探索
>此探索提出了有關
WaitGroup
>的功能(增量/減少計數器和用Wait
阻止),靜音(防止種族條件)的問題,以及省略它們的後果。 用於檢測種族條件的標誌需要進一步調查。 go test -race
以上是並發,GOROUTINES和GO中的渠道:一項研究的詳細內容。更多資訊請關注PHP中文網其他相關文章!