Sobes.tech
Middle

Τι ξέρεις για το πακέτο sync.Map;

sobes.tech AI

Απάντηση από AI

Το πακέτο sync.Map παρέχει έναν ασφαλή πίνακα κατακερματισμού για παράλληλη πρόσβαση. Είναι βελτιστοποιημένο για περιπτώσεις όπου οι κλειδιά διαβάζονται κυρίως και γράφονται σπανιότερα.

Κύρια χαρακτηριστικά:

  • Παραλληλική ασφάλεια: Διασφαλίζει ασφαλή πρόσβαση από πολλαπλά goroutines χωρίς ρητές κλειδώματα.
  • Βελτιστοποιημένο για ανάγνωση: Κατά την πρώτη ανάγνωση κάθε κλειδιού, αποθηκεύεται μια αντιγραφή μόνο για ανάγνωση. Οι επόμενες αναγνώσεις από αυτήν την cache δεν απαιτούν κλείδωμα.
  • Δυναμική διαγραφή: Τα διαγραμμένα στοιχεία σημαίνονται πρώτα ως διαγραμμένα, και η πραγματική διαγραφή γίνεται υπό ορισμένες συνθήκες για ελαχιστοποίηση των κλειδώσεων κατά την εγγραφή.
  • Απουσία μεθόδου Len() : Η υποστήριξη της μεθόδου Len() θα έκανε την υλοποίηση ασφαλή για παράλληλο περιβάλλον πολύπλοκη και δαπανηρή.
  • Μη κατάλληλο για συνεχώς μεταβαλλόμενα δεδομένα: Με συχνές εγγραφές και διαγραφές, μπορεί να είναι λιγότερο αποδοτικό από τη χρήση mutex με έναν κανονικό map.

Βασικές μέθοδοι:

  • Load(key any) (value any, ok bool): Φορτώνει την τιμή που σχετίζεται με το κλειδί. Αν το κλειδί δεν υπάρχει, επιστρέφει false.
  • Store(key, value any): Αποθηκεύει μια τιμή για το κλειδί. Μπορεί να χρησιμοποιηθεί για προσθήκη ή ενημέρωση.
  • LoadOrStore(key any, value any) (actual any, loaded bool): Φορτώνει την τιμή που σχετίζεται με το κλειδί αν ήδη υπάρχει. Διαφορετικά, αποθηκεύει την καθορισμένη τιμή. Επιστρέφει την πραγματική τιμή και ένα σημαία που δείχνει αν η τιμή φορτώθηκε (true) ή αποθηκεύτηκε (false).
  • Delete(key any): Διαγράφει την τιμή για το κλειδί.
  • Range(f func(key, value any) bool): Επαναλαμβάνει τα στοιχεία με τυχαία σειρά. Η συνάρτηση f καλείται για κάθε ζεύγος κλειδιού-τιμής. Αν η f επιστρέφει false, η επανάληψη διακόπτεται.

Παράδειγμα χρήσης:

import "sync"

var m sync.Map

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

	v, ok := m.Load(key)
	if ok {
		// Χρησιμοποιήστε το v
	}

	m.Range(func(key, value any) bool {
		// Επεξεργασία στοιχείων
		return true // Συνεχίστε την επανάληψη
	})
}

Γενικά, το sync.Map είναι μια καλή επιλογή όταν οι παράλληλες αναγνώσεις υπερβαίνουν σημαντικά τις εγγραφές και διαγραφές. Διαφορετικά, η χρήση map με sync.Mutex ή sync.RWMutex μπορεί να είναι πιο κατάλληλη.