Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich gleichzeitiges Mapping in Go?

Wie verwende ich gleichzeitiges Mapping in Go?

王林
王林Original
2023-05-11 17:06:06901Durchsuche

Mit der kontinuierlichen Weiterentwicklung der Go-Sprache haben immer mehr Entwickler damit begonnen, damit Anwendungen mit hoher Parallelität zu erstellen. In gleichzeitigen Anwendungen ist es normalerweise erforderlich, eine Kartendatenstruktur zum Speichern und Verwalten von Daten zu verwenden. Die Go-Sprache bietet einen nativen Map-Typ, der jedoch nicht nebenläufigkeitssicher ist. Wenn Sie Map in einer gleichzeitigen Umgebung verwenden, müssen Sie zum Schutz Mechanismen wie Mutex-Sperren verwenden. Dieser Ansatz führt jedoch zu Leistungseinbußen und ist für Anwendungen in Umgebungen mit hoher Parallelität nicht geeignet. Daher wird in diesem Artikel erläutert, wie Sie die gleichzeitige Zuordnung in Go verwenden, um die Leistung und Stabilität von Anwendungen in Szenarien mit hoher Parallelität zu verbessern.

1. Was ist gleichzeitiges Mapping?

Concurrent Mapping ist eine spezielle Mapping-Datenstruktur, die sichere Lese- und Schreibvorgänge in einer gleichzeitigen Umgebung gewährleisten kann. Es wird normalerweise auf der Grundlage einer Hash-Tabelle implementiert, und auf Elemente in der Karte kann in mehreren Coroutinen gleichzeitig zugegriffen und diese geändert werden. Die Implementierung der gleichzeitigen Zuordnung muss Thread-Sicherheit und hohe Leistung gewährleisten, was besonders für Anwendungen mit hoher Parallelität wichtig ist.

In der Go-Sprache bietet die Standardbibliothek keine native gleichzeitige Mapping-Implementierung. Daher müssen wir selbst eine effiziente und korrekte gleichzeitige Zuordnung erstellen. Als Nächstes stellen wir einige gängige Methoden und Techniken zum Implementieren der gleichzeitigen Zuordnung vor:

2. So implementieren Sie die gleichzeitige Zuordnung

  1. Verwenden Sie sync.Map

Im Synchronisierungspaket der Go-Sprache wird eine native gleichzeitige Zuordnung bereitgestellt. Typ - sync.Map. Es bietet eine Reihe von Methoden zum Verwalten von Elementen in der Zuordnung, z. B. Laden, Speichern, Löschen und Bereich, mit denen problemlos gleichzeitige und sichere Lese- und Schreibvorgänge implementiert werden können. Diese Art der Implementierung kann Thread-Sicherheit und -Effizienz gewährleisten und ist eine gute Wahl.

Es ist jedoch zu beachten, dass sync.Map nicht für alle Gelegenheiten geeignet ist. Beispielsweise ist es nicht geeignet, wenn Sie die gesamte Karte durchqueren oder Kartennachrichten sortieren oder ähnliche Vorgänge ausführen müssen. Weil die Durchlaufreihenfolge der Elemente in sync.Map zufällig ist und die spezifische Anordnungsreihenfolge ungewiss ist. Daher müssen Sie bei der Verwendung von sync.Map dies auf der Grundlage spezifischer Geschäftsanforderungen berücksichtigen.

Als nächstes werfen wir einen Blick auf das Anwendungsbeispiel von sync.Map:

var syncMap sync.Map

syncMap.Store("key1", "value1")
value, ok := syncMap.Load("key1")
if ok {
    fmt.Println(value)
}

syncMap.Delete("key1")
  1. Implementierung basierend auf Mutex-Sperre

Die Implementierung der gleichzeitigen Zuordnung basierend auf Mutex-Sperre ist relativ einfach und Thread-Sicherheit wird durch Sperren erreicht. Der Typ sync.Mutex ist im Standardpaket der Go-Sprache enthalten und kann die Sicherheit der Parallelität durch Mutex-Sperren gewährleisten. Es ist jedoch zu beachten, dass die Sperr- und Entsperrvorgänge des Mutex zeitaufwändig sind und es daher in Szenarien mit hoher Parallelität leicht zu Leistungsengpässen kommt, die die Parallelitätsfähigkeiten des Systems beeinträchtigen.

Das Folgende ist ein Beispielcode für die Implementierung einer gleichzeitigen Zuordnung basierend auf Mutex-Sperren:

type SafeMap struct {
    sync.Mutex
    data map[string]string
}

func (m *SafeMap) Load(key string) (value string, ok bool) {
    m.Lock()
    defer m.Unlock()
    value, ok = m.data[key]
    return
}

func (m *SafeMap) Store(key string, value string) {
    m.Lock()
    defer m.Unlock()
    m.data[key] = value
}

In diesem Beispiel definieren wir einen SafeMap-Typ, der eine interne Daten-Map und eine Mutex-Sperre zum Sperren der Map enthält. Wenn Sie Lese- und Schreibvorgänge ausführen, müssen Sie zuerst die Mutex-Sperre sperren, dann Lese- und Schreibvorgänge ausführen und schließlich die Mutex-Sperre entsperren, um die Thread-Sicherheit zu gewährleisten.

3. Leistung und Vorsichtsmaßnahmen beim gleichzeitigen Mapping

  1. Leistungsvergleich

In den oben genannten Implementierungsmethoden für gleichzeitiges Mapping können wir Leistungstests verwenden, um die Leistung zwischen ihnen zu vergleichen. Das Folgende ist ein Beispielcode für Leistungstests mit Benchmark:

func BenchmarkSafeMap(b *testing.B) {
    sm := SafeMap{data: make(map[string]string)}
    for i := 0; i < b.N; i++ {
        go func() {
            sm.Store("key1", "value1")
            sm.Delete("key1")
        }()
    }
}

Es ​​ist zu beachten, dass SafeMap beim Lesen und Schreiben Sperr- und Entsperrvorgänge erfordert, sodass beim Leistungstest ein gewisser Verlust auftritt. Sync.Map verwendet einige hochoptimierte Parallelitätssicherheitsalgorithmen, sodass es bei Leistungstests weniger wahrscheinlich zu Leistungsengpässen kommt.

  1. Hinweise

Bei der Implementierung der gleichzeitigen Zuordnung müssen Sie auf die folgenden Punkte achten:

  • Es muss die Thread-Sicherheit gewährleistet und durch Mechanismen wie Mutex-Sperren gehandhabt werden.
  • Effizienz muss gewährleistet sein und zeitaufwändige Vorgänge wie das Kopieren von Daten sollten so weit wie möglich vermieden werden.
  • Deadlocks müssen vermieden werden, insbesondere beim Betrieb zwischen mehreren Mappings ist Vorsicht geboten.

4. Zusammenfassung

In diesem Artikel haben wir das Konzept der gleichzeitigen Zuordnung und zwei Methoden zur Implementierung der gleichzeitigen Zuordnung in der Go-Sprache vorgestellt: basierend auf sync.Map und basierend auf Mutex-Sperren. Gleichzeitig besprachen wir auch die Auswahl der in der Praxis am besten geeigneten Lösung sowie Vorsichtsmaßnahmen und Leistungstests.

Das Verständnis des Konzepts und der Implementierung des gleichzeitigen Mappings ist wichtig für die Erstellung von Anwendungen mit hoher Parallelität. In der Praxis müssen wir basierend auf den spezifischen Geschäftsanforderungen die am besten geeignete Implementierungsmethode für gleichzeitiges Mapping auswählen, um die Leistung und Stabilität von Anwendungen in Szenarien mit hoher Parallelität zu verbessern.

Das obige ist der detaillierte Inhalt vonWie verwende ich gleichzeitiges Mapping in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn