ホームページ  >  記事  >  バックエンド開発  >  golang関数とgoroutine間の同期機構

golang関数とgoroutine間の同期機構

王林
王林オリジナル
2024-04-26 09:42:01894ブラウズ

Go の同期メカニズムには次のものが含まれます。 チャネル: ブロッキング送受信操作を使用して、Goroutine 間でデータを安全に転送するために使用されます。ミューテックス ロック: 同時に 1 つの Goroutine だけが共有リソースにアクセスできるようにします。待機グループ: 完了を待機しているゴルーチンの数を追跡します。このメカニズムにより、メインのゴルーチンは実行を続行する前にすべてのゴルーチンが完了するのを待つことができます。

golang関数とgoroutine間の同期機構

Go における関数とゴルーチンの同期メカニズム

Go では、関数とゴルーチンは同時実行単位です。それらの間の調整とデータの整合性を確保するには、同期メカニズムが必要です。この記事では、Go で一般的に使用される同期メカニズムを紹介し、実際のケースを示します。

チャネル

チャネルは、Goroutine 間でデータを安全に転送するために使用されるバッファです。チャネルの送信操作 (ch ) と受信操作 (<code>v := ) は両方ともブロックされています。これは、送信側はチャネルに利用可能なスペースがある場合にのみデータを送信し、受信側はチャネルに利用可能なデータがある場合にのみデータを受信することを意味します。

実践的なケース: チャネルを使用して複数の Goroutine 間でデータを転送する

package main

import "fmt"

func main() {
    // 创建一个带有缓冲区的通道(可以存储最多 10 个值)
    ch := make(chan int, 10)

    // 启动 5 个 Goroutine 向通道发送数据
    for i := 0; i < 5; i++ {
        go func(i int) {
            ch <- i
        }(i)
    }

    // 从通道接收数据并打印结果
    for i := 0; i < 5; i++ {
        fmt.Println(<-ch)
    }
}

Mutex (ミューテックス)

Mutex は低-level 同期メカニズムは、1 つの Goroutine だけが同時に共有リソースにアクセスできるようにするために使用されます。 sync.Mutex タイプは、ミューテックス ロックへのアクセスを提供します。

実践的なケース: ミューテックス ロックを使用して共有リソースへのアクセスを保護する

package main

import (
    "fmt"
    "sync"
)

var (
    mu      sync.Mutex // 定义一个互斥锁
    counter int       // 共享资源
)

func main() {
    for i := 0; i < 100; i++ {
        go func(i int) {
            // 获取互斥锁
            mu.Lock()
            defer mu.Unlock() // 释放互斥锁

            // 访问共享资源
            counter++
            fmt.Printf("Goroutine %d: counter = %d\n", i, counter)
        }(i)
    }
}

待機グループ (WaitGroup)

待機グループ完了を待機しているゴルーチンの数を追跡するために使用されます。ゴルーチンが完了すると、Done メソッドを呼び出して待機グループ数をデクリメントします。メインの Goroutine は、Wait メソッドを呼び出すことで、すべての Goroutine が完了するまでブロックできます。

#実践的なケース: 待機グループを使用してすべての Goroutine が完了するのを待ちます

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    // 启动 5 个 Goroutine
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(i int) {
            fmt.Printf("Goroutine %d started\n", i)
            defer wg.Done() // Goroutine 完成时调用 Done
        }(i)
    }

    // 等待所有 Goroutine 完成
    wg.Wait()
    fmt.Println("All Goroutines finished")
}

同期メカニズムを理解することが重要です

正しいものを選択してください 同期メカニズムは、同時環境で堅牢で正しい Go プログラムを構築するために重要です。チャネル、ミューテックス、待機グループの使用法を理解することで、関数とゴルーチンの間の調整とデータの一貫性を確保できます。

以上がgolang関数とgoroutine間の同期機構の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。