Go コルーチンは、チャネル (データの送受信) と同期プリミティブ (共有リソースへのアクセスの管理) を通じて通信します。チャネルは、送信操作と受信操作を通じてコルーチン間でデータを転送するために使用されます。同期プリミティブには、ミューテックス ロック (共有リソースへのアクセスを制御するため)、条件変数 (実行を継続する前に条件が満たされるまで待機するため)、およびワンタイム シグナル (操作が 1 回だけ実行されるようにするため) が含まれます。
コルーチンとは何ですか?
コルーチンは、別個のシステム スレッドを作成せずに同時実行を可能にする軽量のスレッドです。これは、より効率的でリソースを節約する同時プログラミングの方法を提供します。
通信メカニズム
Go コルーチンは、次の 2 つのメカニズムを通じて通信できます。
チャネル
チャネルは、2 つの操作を提供する同期通信メカニズムです:
chan< ;- 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() }
同期プリミティブ
同期プリミティブを使用できます。共有リソースへのアクセスを調整します。一般的に使用される同期プリミティブの一部を次に示します。
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 サイトの他の関連記事を参照してください。