ホームページ >バックエンド開発 >Golang >Golangコルーチンの通信機構

Golangコルーチンの通信機構

WBOY
WBOYオリジナル
2024-04-15 21:48:01780ブラウズ

Go コルーチンは、チャネル (データの送受信) と同期プリミティブ (共有リソースへのアクセスの管理) を通じて通信します。チャネルは、送信操作と受信操作を通じてコルーチン間でデータを転送するために使用されます。同期プリミティブには、ミューテックス ロック (共有リソースへのアクセスを制御するため)、条件変数 (実行を継続する前に条件が満たされるまで待機するため)、およびワンタイム シグナル (操作が 1 回だけ実行されるようにするため) が含まれます。

Golangコルーチンの通信機構

Go コルーチンの通信メカニズム

コルーチンとは何ですか?

コルーチンは、別個のシステム スレッドを作成せずに同時実行を可能にする軽量のスレッドです。これは、より効率的でリソースを節約する同時プログラミングの方法を提供します。

通信メカニズム

Go コルーチンは、次の 2 つのメカニズムを通じて通信できます。

  • Channel: バッファリングされていない、またはデータの送受信に使用されるバッファリングされたパイプ。
  • 同期プリミティブ: ミューテックス ロック、条件変数、ワンタイム シグナルなど、共有リソースへの同時アクセスを管理するために使用されます。

チャネル

チャネルは、2 つの操作を提供する同期通信メカニズムです:

  • chan&lt ;- v : 値 v をチャネルに送信します。
  • : チャネルから値を受け取ります。

次の例は、パイプを使用して 2 つのコルーチン間でメッセージを渡す方法を示しています。

package main

import (
    "fmt"
    "sync"
)

func main() {
    // 创建一个无缓冲管道
    message := make(chan string)

    // 启动一个发送协程
    go func() {
        // 向通道发送消息
        message <- "Hello from the sending goroutine!"
    }()

    // 启动一个接收协程
    go func() {
        // 从通道接收消息
        msg := <-message
        fmt.Println(msg) // 输出: Hello from the sending goroutine!
    }()

    // 等待协程完成
    var wg sync.WaitGroup
    wg.Add(2)
    wg.Wait()
}

同期プリミティブ

同期プリミティブを使用できます。共有リソースへのアクセスを調整します。一般的に使用される同期プリミティブの一部を次に示します。

  • Mutex ロック (sync.Mutex): 一度に 1 つのコルーチンのみが共有リソースにアクセスできるようにします。
  • 条件変数 (sync.Cond): 実行を続行する前に、特定の条件が満たされるのを待つために使用されます。
  • ワンタイムシグナル (sync.Once): 操作が 1 回だけ実行されるようにします。

次の例は、ミューテックスを使用して共有リソースへのアクセスを保護する方法を示しています。

package main

import (
    "fmt"
    "sync"
)

var counter int
var mu sync.Mutex

func main() {
    // 启动多个协程同时对共享变量进行加法
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            mu.Lock()
            counter++
            mu.Unlock()
            wg.Done()
        }()
    }

    wg.Wait()
    fmt.Println(counter) // 输出: 100
}

Go コルーチンの通信メカニズムを理解することは、効率的でスケーラブルな同時アプリケーションを開発するために重要です。 。

以上がGolangコルーチンの通信機構の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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