Sobes.tech
Junior — Middle

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

sobes.tech AI

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

Go լեզվում ստանդարտ քարտը (map) անվտանգ չէ միաժամանակյա ընթերցման և գրության համար տարբեր goroutine-ներից։ Բազմամյա միջավայրում քարտերով աշխատելու անվտանգությունը ապահովելու համար կարելի է օգտագործել.

  1. Մյուտեքսներ (sync.Mutex կամ sync.RWMutex) — արգելափակում են մապի մուտքը ընթերցման/գրության ժամանակ։
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 — հատուկ, բազմամյա անվտանգ կառուցվածք ստանդարտ գրադարանից, օպտիմալացված մեծ թվով goroutine-ների համար։
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
}

ընտրությունը կախված է կոնկրետ առաջադրանքից։ Եթե շատ գրառումներ և ընթերցումներ են անհրաժեշտ, ավելի լավ է օգտագործել մյուտեքսներ։ Եթե հիմնականում ընթերցումներ են, ապա sync.Map-ը կարող է ավելի արդյունավետ լինել։