Hogyan lehet biztonságosan dolgozni a Map gyűjteménnyel több szálas környezetben?
sobes.tech MI
Válasz az MI-től
Go-ban a standard map (térkép) nem biztonságos több goroutine egyidejű olvasására és írására. Többszálú környezetben a térkép biztonságos működésének biztosításához a következő megközelítéseket lehet alkalmazni:
- Szinkronizálás mutex segítségével
Használja a sync.Mutex vagy sync.RWMutex-t a térkép hozzáférésének védelmére. Íráskor zárja le a mutexet írásra, olvasáskor — olvasásra (ha RWMutex-t használ).
import "sync"
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func (s *SafeMap) Get(key string) (int, bool) {
s.mu.RLock()
defer s.mu.RUnlock()
val, ok := s.m[key]
return val, ok
}
func (s *SafeMap) Set(key string, val int) {
s.mu.Lock()
defer s.mu.Unlock()
s.m[key] = val
}
- sync.Map használata
Go-ban létezik egy specializált struktúra, a sync.Map, amely optimalizált a konkurens hozzáférésre, és nem igényel manuális szinkronizációt.
import "sync"
var m sync.Map
// Írás
m.Store("key", 42)
// Olvasás
val, ok := m.Load("key")
- Csatornák (channels) használata
A hozzáférést a térképhez szervezheti egy goroutine segítségével, amely a kérésokat olvasásra és írásra csatornákon keresztül kezeli, biztosítva a szekvenciális hozzáférést.
A módszer kiválasztása a teljesítmény- és implementációs komplexitási követelményektől függ.