Heim  >  Artikel  >  Backend-Entwicklung  >  Gleichzeitiges Mapping mit Slices in Golang

Gleichzeitiges Mapping mit Slices in Golang

WBOY
WBOYnach vorne
2024-02-11 09:57:091101Durchsuche

golang 中带有切片的并发映射

php-Editor Banana hat einen wunderbaren Artikel über die gleichzeitige Zuordnung von Slices in Golang mitgebracht. In diesem Artikel werden wir uns mit der Verwendung von Slices für Mapping-Vorgänge in einer gleichzeitigen Umgebung befassen und erklären, warum Slices bei der gleichzeitigen Programmierung sehr nützlich sind. Durch die Verwendung des Parallelitätsmechanismus von Golang können wir gleichzeitig auf Slices in mehreren Goroutinen zugreifen und diese ändern, wodurch die Leistung und Effizienz des Programms verbessert wird. Egal, ob Sie Anfänger oder erfahrener Golang-Entwickler sind, dieser Artikel vermittelt Ihnen wertvolles Wissen und praktische Fähigkeiten. Lassen Sie uns die gleichzeitige Zuordnung mit Slices in Golang erkunden!

Frageninhalt

Ich habe versucht, ein Parallelitätsproblem zu lösen, nachdem einer der Entwickler vor ein paar Monaten das Feld verlassen hat, aber ich kann keinen geeigneten Weg finden, dieses Problem zu lösen.

Für den Kontext laden wir die Kundendaten in eine Struktur wie diese:

[ 键 ] -> { 值 }

[客户特定哈希] -> {数据点/文件切片}

Beispiel – wirklich schlechte Formatierung, sorry:

[a60d849ad97bfb833e1096941] 
-> 
{ 
 { StartDate: '01-02-2022', EndDate: '28-02-2022', DataFrames: [1598,921578,12981,21749,192578...]},
 { StartDate: '01-03-2022', EndDate: '28-03-2022', DataFrames: [1234,1567,6781,126978...]},
}

Das Obige liegt daran, dass wir 100.000 Kunden haben und jede Nacht einen Prozess starten, um die Daten basierend auf dem Hash jedes Kunden (oder eigentlich einem Bucket) zu konsolidieren. Bevor wir die Datenrahmen verarbeiten, durchlaufen wir die Slices und „fügen“ die Datenrahmen zu einem großen Datenrahmen zusammen, der viele rechtliche/buchhalterische Regeln enthält.

Es läuft in einer Goroutine, um alle Datenpunkte so schnell wie möglich zu indizieren.

Die Implementierung ist also im Wesentlichen eine sync.Map[string, []DataFrame] Aber mir ist aufgefallen, dass die Kartenoperation zwar geschützt ist, das Anhängen an den Datenrahmen-Slice jedoch nicht. Jeder Hash hat pro Nacht wahrscheinlich etwa 20–30 Dateiverweise in diesem Slice.

Es besteht eine gute Chance, dass Kundendaten in den letzten zwei Jahren falsch zusammengeführt wurden, und ich habe die Aufgabe, das Problem zu beheben. Vor sync.map verwendeten sie erneut RWMutex mit Map, jedoch nicht mit Slicing, was auf diesen Artikel als Leitfaden verweist.

Ist die Idee einer Karte, die Slices enthält, zunächst einmal eine geeignete Datenstruktur?

Ich versuche, einen Slice-Handler auf Basis von RWMutex zu erstellen, habe mich aber gefragt, ob eine Karte einen haben könnte chan DataFrame 来代替在索引客户文件时放入,然后一旦完成,第二步将其合并到一个数组中(如len(chanx)) Wäre das bekannt?

Ich komme hauptsächlich aus Java, daher könnte es sein, dass ich mit einigen Begriffen verwechselt werde, also tut es mir leid.

Lösung

Sie haben zwei verschiedene Probleme:

  1. Beim Aktualisieren der Karte traten Probleme mit der Parallelität auf
  2. Parallelitätsprobleme beim Aktualisieren von Karteneinträgen

sync.Map verhindert 1, aber nicht 2.

Eine Möglichkeit, dieses Problem zu lösen, ist:

sync.Map[string, *DFrame]

Wo

type DFrame struct {
  sync.RWMutex 
  Data []DataFrame
}

Sobald Sie die Einträge aus der Karte erhalten haben, sollten Sie LockRLock 它,然后使用数据。这不仅仅限于切片的附加。即使您只从数据帧中读取,您也必须 RLock die Struktur festlegen.

Wenn Sie also einen neuen Datenrahmen anhängen möchten:

df := &DFrame{}
entry,_:=m.LoadOrStore(key, df)
dfEntry:=entry.(*DFrame)
dfEntry.Lock()
dfEntry.Data=append(dfEntry.Data, newDataFrame)
dfEntry.Unlock()

Das obige ist der detaillierte Inhalt vonGleichzeitiges Mapping mit Slices in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen