Maison  >  Article  >  développement back-end  >  Comment les canaux peuvent-ils améliorer la simultanéité avec Go avec des cartes partagées ?

Comment les canaux peuvent-ils améliorer la simultanéité avec Go avec des cartes partagées ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-01 10:02:30150parcourir

How Can Channels Enhance Concurrency in Go with Shared Maps?

Concurrence et cartes partagées : une approche plus idiomatique

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é :

  • Les Goroutines accèdent aux valeurs via les canaux valueCh et setCh.
  • La mise à jour de la carte goroutine traite les requêtes GET et SET simultanément et met à jour les valeurs en conséquence.
  • La synchronisation est gérée naturellement via la communication par canal, éliminant ainsi le besoin de mutex explicites.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn