Teknik Pelaksanaan Peta Kongsi yang Cekap dalam Go
Akses serentak kepada struktur data dikongsi memerlukan pertimbangan yang teliti untuk memastikan integriti data. Pertimbangkan kes peta yang diakses secara serentak oleh berbilang goroutin, seperti yang dilihat dalam contoh di bawah.
<code class="go">func getKey(r *http.Request) string { ... } values := make(map[string]int) http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) { key := getKey(r) fmt.Fprint(w, values[key]) }) http.HandleFunc("/set", func(w http.ResponseWriter, r *http.Request) { key := getKey(r) values[key] = rand.Int() })</code>
Manipulasi langsung peta melalui penulisan serentak boleh membawa kepada ketidakkonsistenan data. Menggunakan mutex, seperti yang ditunjukkan di bawah, menangani isu atomicity tetapi memperkenalkan masalah lain.
<code class="go">func getKey(r *http.Request) string { ... } values := make(map[string]int) var lock sync.RWMutex http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) { key := getKey(r) lock.RLock() fmt.Fprint(w, values[key]) lock.RUnlock() }) http.HandleFunc("/set", func(w http.ResponseWriter, r *http.Request) { key := getKey(r) lock.Lock() values[key] = rand.Int() lock.Unlock() })</code>
Walaupun mutex menyediakan penyegerakan yang boleh dipercayai, ia memperkenalkan kerumitan penguncian dan buka kunci manual. Pendekatan yang lebih idiomatik dalam Go melibatkan penggunaan saluran. Secara lalai, adalah disyorkan untuk mengutamakan saluran daripada mutex, seperti yang ditunjukkan oleh moto Go: "Kongsi memori dengan berkomunikasi, jangan berkomunikasi dengan berkongsi memori."
Berikut ialah beberapa pertimbangan utama:
Atas ialah kandungan terperinci Bagaimanakah Prinsip Concurrency Go Boleh Digunakan untuk Mencipta Peta Kongsi yang Selamat dan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!