Sobes.tech
Middle — Middle+

Ինչպես ապահովել անվտանգ աշխատանք Map հավաքածուի հետ բազմամյա միջավայրում?

sobes.tech AI

Պատասխան AI-ից

Go-ում ստանդարտ քարտը (map) չի ապահովում միաժամանակյա ընթերցում և գրառում տարբեր goroutine-ներից։ Անվտանգ գործելու համար բազմամյա միջավայրում, կարող եք օգտագործել հետևյալ մոտեցումները՝

  1. Սինխրոնիզացիա mutex-ի միջոցով

Օգտագործեք sync.Mutex կամ sync.RWMutex՝ քարտի մուտքը պաշտպանելու համար։ Գրառման ժամանակ փակեք mutex-ը գրելու համար, ընթերցման ժամանակ՝ ընթերցելու համար (եթե օգտագործում եք RWMutex):

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
}
  1. sync.Map-ի օգտագործում

Go-ում կա հատուկ sync.Map կառուցվածք, որը օպտիմալիզացված է մրցակցային մուտքի համար և չի պահանջում ձեռքով սինխրոնիզացիա:

import "sync"

var m sync.Map

// Գրառում
m.Store("key", 42)

// Կարդալ
val, ok := m.Load("key")
  1. Կանալների (channels) օգտագործում

Կարող եք կազմակերպել մուտքը քարտի միջոցով՝ goroutine-ով, որը կառավարում է ընթերցման և գրառման հարցումները channels-ով, ապահովելով հերթական մուտքը:

Ընտրությունը կախված է կոնկրետ պահանջներից՝ կատարողականության և իրականացման բարդությունից։