Sobes.tech
Junior — Middle

Kā nodrošināt drošību, strādājot ar Map daudzprocesu vidē?

sobes.tech AI

Atbilde no AI

Go valodā standarta karte (map) nav droša vienlaicīgai lasīšanai un rakstīšanai no dažādām gorutīnām. Lai nodrošinātu drošību darbā ar kartēm daudzvītnēs vidēs, var izmantot:

  1. Aizslēgumus (sync.Mutex vai sync.RWMutex) — bloķē piekļuvi kartei lasīšanas/rakstīšanas laikā.
var (
    m = make(map[string]int)
    mu sync.RWMutex
)

func read(key string) int {
    mu.RLock()
    defer mu.RUnlock()
    return m[key]
}

func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}
  1. sync.Map — specializēta, droša daudzvītnu struktūra no standarta bibliotēkas, optimizēta lielam gorutīnu skaitam.
var m sync.Map

func write(key string, value int) {
    m.Store(key, value)
}

func read(key string) (int, bool) {
    val, ok := m.Load(key)
    if !ok {
        return 0, false
    }
    return val.(int), true
}

Izvēle ir atkarīga no konkrētās uzdevuma prasībām: ja nepieciešams daudz rakstīšanas un lasīšanas operāciju, labāk izmantot aizslēgumus; ja operācijas galvenokārt ir lasīšana, sync.Map var būt efektīvāka.