Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Membaca Data Dikongsi dengan Selamat daripada Rutin Parallel Go?

Bagaimana untuk Membaca Data Dikongsi dengan Selamat daripada Rutin Parallel Go?

Barbara Streisand
Lepaskan: 2025-01-02 14:31:39
asal
412 orang telah melayarinya

How to Safely Read Shared Data from Parallel Go Routines?

Membaca 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()
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan