Go の同期メカニズムには次のものが含まれます。 チャネル: ブロッキング送受信操作を使用して、Goroutine 間でデータを安全に転送するために使用されます。ミューテックス ロック: 同時に 1 つの 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 サイトの他の関連記事を参照してください。