Sobes.tech
Middle — Middle+

Çox ipli mühitdə Map kolleksiyası ilə təhlükəsiz işləməni necə təmin etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Go-da standart xəritə (map) müxtəlif goroutinlərdən eyni zamanda oxuma və yazma üçün təhlükəsiz deyil. Çox ipli mühitdə xəritənin təhlükəsiz işləməsini təmin etmək üçün aşağıdakı yanaşmalar istifadə oluna bilər:

  1. Mutex ilə sinxronizasiya

sync.Mutex və ya sync.RWMutex istifadə edərək xəritəyə girişləri qoruyun. Yazarkən mutex-i bağlayın, oxuyarkən isə — oxuma üçün (əgər RWMutex istifadə edirsinizsə).

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 istifadə

Go-da, eyni zamanda giriş üçün optimallaşdırılmış və əl ilə sinxronizasiya tələb etməyən sync.Map adlı xüsusi struktur mövcuddur.

import "sync"

var m sync.Map

// Yazma
m.Store("key", 42)

// Oxuma
val, ok := m.Load("key")
  1. Kanal (channels) istifadə

Map-ə giriş, oxuma və yazma tələblərini kanallar vasitəsilə idarə edən goroutine ilə təşkil edilə bilər, bu da ardıcıl giriş təmin edir.

Yöntəm seçimi, xüsusi performans və tətbiq mürəkkəbliyinə bağlıdır.