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 μπορεί να είναι πιο κατάλληλη.