ホームページ > バックエンド開発 > Golang > Goの並行性、ゴルチン、およびチャネル:研究

Goの並行性、ゴルチン、およびチャネル:研究

DDD
リリース: 2025-01-30 00:03:10
オリジナル
373 人が閲覧しました

この記事では、ゴルチンとチャンネルに焦点を当てたGoの同時機能の機能を調査します。 並行性により、同時に同時にそうではありませんが、複数のタスクを同時に処理することができます。 GoRoutines、Goの軽量スレッドは、

キーワードを使用して作成され、同時操作を可能にします。チャネルは、ゴルチン間のコミュニケーションと同期を促進し、データ交換を可能にします。 データを送信しますgo ch <- valuedockerプルのような例は、これらの概念を示しています:value := <- ch

プログラムは、同時タスクをシミュレートします。 各ゴルウチンは、完了まで進行状況を更新します。ミューテックスは、共有の進行値を更新するときにスレッドの安全性を保証します。 Waitgroupはゴルウチンの完了を同期させます

キー学習
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)
}

この例は、ゴルチンの作成と同時処理のための
キーワードの使用を強調しています。 Goroutinesが複数の進行状況インジケーターを同時に処理する方法を示しています Concurrency, Goroutines, and Channels in Go: A Studyさらなる調査

この探索は、

の機能(カウンターの増加/減少と

でのブロック)、ミューテックス(人種条件の防止)、およびそれらを省略した結果に関する疑問を提起します。 人種条件を検出するための

フラグは、さらなる調査を必要とします。

以上がGoの並行性、ゴルチン、およびチャネル:研究の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート