Maison > Article > développement back-end > Comment les canaux peuvent-ils améliorer la simultanéité avec Go avec des cartes partagées ?
Dans Go, l'accès simultané aux cartes partagées nécessite un examen attentif pour éviter les écritures non atomiques. Bien que des mutex puissent être utilisés, ils introduisent l'utilisation de primitives qui peuvent ne pas correspondre à l'approche idiomatique Go.
Une alternative consiste à exploiter les canaux pour le contrôle de la concurrence. Cette approche s'aligne sur la philosophie Go selon laquelle « partager la mémoire en communiquant, ne pas communiquer en partageant la mémoire ». Au lieu de manipuler directement la carte, les goroutines peuvent communiquer via des canaux, assurant un accès exclusif aux données partagées.
Par exemple, dans le code original, les modifications suivantes peuvent être apportées :
<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>
Dans ce code révisé :
En adoptant cette approche basée sur le canal, le code devient plus idiomatique, simplifie la gestion de la concurrence et adhère aux principes de Go consistant à éviter la mémoire partagée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!