Masalah:
Dalam Go, bagaimana data boleh dibaca dengan selamat daripada benang berasingan dalam pengkomputeran selari? Secara khususnya, bagaimanakah data boleh dikumpul daripada urutan pekerja tanpa menjejaskan integriti data?
Senario:
Urutan utama mencipta berbilang tika pekerja yang dijalankan secara tidak segerak. Setiap 10 saat, urutan utama perlu mengumpulkan nilai (cth., kiraan lelaran) daripada pekerja dan memaparkan laporan yang disatukan.
Soalan:
Adakah selamat untuk terus membaca nilai daripada pekerja? Selain itu, adakah terdapat pendekatan alternatif untuk melaksanakan keperluan ini dengan cekap?
Jawapan:
Membaca nilai secara langsung daripada pekerja adalah tidak selamat kerana ia melanggar model konkurensi Go. Dalam Go, data yang dikongsi antara goroutine mesti dilindungi dengan mekanisme penyegerakan untuk mengelakkan rasuah data daripada operasi tulis serentak.
Untuk menangani perkara ini, satu pendekatan ialah menggunakan struktur data penyegerakan.RWMutex:
Contoh pelaksanaan menggunakan penyegerakan.RWMutex:
type Worker struct { iterMu sync.RWMutex iter int } func (w *Worker) Iter() int { w.iterMu.RLock() defer w.iterMu.RUnlock() return w.iter } func (w *Worker) setIter(n int) { w.iterMu.Lock() w.iter = n w.iterMu.Unlock() }
Sebagai alternatif, pakej penyegerakan/atom menawarkan operasi atom yang memastikan akses selamat benang kepada pembolehubah kongsi. Contoh pelaksanaan menggunakan penyegerakan/atom:
type Worker struct { iter int64 } func (w *Worker) Iter() int64 { return atomic.LoadInt64(&w.iter) } func (w *Worker) setIter(n int64) { atomic.StoreInt64(&w.iter, n) }
Dengan menggunakan kaedah ini, kedua-dua pendekatan menyediakan penyelesaian yang mantap untuk membaca nilai daripada urutan berasingan sambil mengekalkan integriti data.
Atas ialah kandungan terperinci Bagaimana untuk Membaca Data Dikongsi dengan Selamat daripada Rutin Parallel Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!