首頁 > 後端開發 > Golang > 並發,GOROUTINES和GO中的渠道:一項研究

並發,GOROUTINES和GO中的渠道:一項研究

DDD
發布: 2025-01-30 00:03:10
原創
373 人瀏覽過

>本文探討了GO的並發功能,專注於goroutines和頻道。 並發允許似乎同時處理多個任務,儘管不一定同時處理。 GOROUTINE,GO的輕量級線程是使用go>關鍵字創建的,可以並發操作。渠道促進了goroutines之間的通信和同步,從而啟用數據交換。 發送數據使用ch <- value,在接收用法value := <- ch>。

docker拉動的示例演示了這些概念:

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完成。 


Concurrency, Goroutines, and Channels in Go: A Study

>

鍵學習

go>該示例突出顯示了用於Goroutine創建和並發處理的關鍵字的使用。 它演示了Goroutines如何同時處理多個進度指標。

>

進一步探索

>此探索提出了有關WaitGroup>的功能(增量/減少計數器和用Wait阻止),靜音(防止種族條件)的問題,以及省略它們的後果。 用於檢測種族條件的標誌需要進一步調查。 go test -race

以上是並發,GOROUTINES和GO中的渠道:一項研究的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板