Jadual Kandungan
Membaca Nilai daripada Data Dikongsi dalam Rutin Selari Go
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?

Jan 02, 2025 pm 02:31 PM

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

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

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

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 menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

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

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

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

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

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? Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya? Mar 10, 2025 pm 05:38 PM

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

See all articles