Go では、共有マップへの同時アクセスには、非アトミックな書き込みを避けるために慎重な考慮が必要です。ミューテックスを使用することはできますが、プリミティブの使用が導入され、慣用的な Go アプローチと一致しない可能性があります。
1 つの代替案は、同時実行制御にチャネルを活用することです。このアプローチは、「メモリを共有することで通信するのではなく、通信することでメモリを共有する」という Go の哲学と一致しています。マップを直接操作する代わりに、ゴルーチンはチャネル経由で通信でき、共有データへの排他的アクセスを保証します。
たとえば、元のコードでは次の変更を加えることができます:
<code class="go">// key retrieval logic remains the same values := make(map[string]int) var valueCh = make(chan string) var setCh = make(chan map[string]int) // Handler for GET requests http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) { key := getKey(r) valueCh <- key fmt.Fprint(w, <-valueCh) }) // Handler for SET requests http.HandleFunc("/set", func(w http.ResponseWriter, r *http.Request) { key := getKey(r) tmp := make(map[string]int) tmp[key] = rand.Int() setCh <- tmp }) // Map update goroutine go func() { for { select { case key := <-valueCh: valueCh <- values[key] case updatedMap := <-setCh: for k, v := range updatedMap { values[k] = v } } } }()</code>
この改訂されたコード:
このチャネルベースのアプローチを採用することで、コードがより慣用的になり、同時実行管理が簡素化され、Go の原則に準拠します。共有メモリを回避します。
以上がチャネルは共有マップを使用して Go の同時実行性をどのように強化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。