


Bagaimana untuk Membaca Data Dikongsi dengan Selamat daripada Rutin Parallel Go?
Jan 02, 2025 pm 02:31 PMMembaca Nilai daripada Data Dikongsi dalam Rutin Selari Go
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:
- Tulis kunci: Diperolehi oleh pekerja apabila mengubah suai data kongsi, memastikan eksklusif akses.
- Baca kunci: Diperolehi oleh urutan utama apabila membaca data yang dikongsi, membenarkan bacaan serentak tetapi menghalang penulisan.
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!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya?
