Pakej sync
di Go adalah sebahagian daripada Perpustakaan Standard Go yang menyediakan primitif peringkat rendah untuk menguruskan penyegerakan dan komunikasi goroutine. Adalah penting untuk menulis program serentak dan selari di GO. Beberapa ciri utama pakej sync
termasuk:
Mutex
(Pengecualian Bersama) Kunci menyediakan akses eksklusif, manakala RWMutex
(baca-write Mutex) membolehkan beberapa pembaca atau seorang penulis mengakses sumber secara serentak. Ciri -ciri ini menjadikan pakej sync
alat yang sangat diperlukan untuk menguruskan persetujuan dalam program GO.
Pakej sync
dapat meningkatkan prestasi program GO serentak dalam beberapa cara:
Mutex
dan RWMutex
membolehkan goroutine mengakses data bersama dengan selamat dan cekap. RWMutex
boleh memberikan manfaat prestasi dalam senario di mana bacaan lebih kerap daripada menulis, kerana ia membolehkan pembaca serentak.sync.Pool
membantu mengurangkan peruntukan memori dan overhead pengumpulan sampah dengan menggunakan semula objek sementara. Ini boleh memberi manfaat terutamanya dalam sistem serentak tinggi di mana penciptaan dan kemusnahan objek sering berlaku.sync.WaitGroup
membolehkan penyegerakan goroutin yang cekap, memastikan program boleh menunggu pelbagai tugas untuk diselesaikan tanpa menyekat yang tidak perlu. Ini dapat membantu mengoptimumkan penggunaan sumber dan meningkatkan keseluruhan operasi serentak.sync.Cond
membolehkan corak penyegerakan yang lebih canggih, yang membolehkan goroutine menunggu sehingga keadaan tertentu dipenuhi. Ini dapat meningkatkan prestasi dengan mengurangkan menunggu yang tidak perlu dan membolehkan perkongsian sumber yang lebih cekap.sync.Map
menyediakan peta serentak yang boleh diakses tanpa mengunci luaran, meningkatkan prestasi dengan mengurangkan pertarungan kunci dalam senario multi-goroutine.Dengan menggunakan primitif ini, pemaju boleh menulis program serentak yang lebih cekap dan berskala, menggunakan sumber sistem yang lebih baik.
sync.Mutex
dan sync.RWMutex
biasanya digunakan dalam GO untuk melindungi sumber bersama dalam persekitaran serentak. Berikut adalah beberapa kes penggunaan biasa:
sync.mutex:
Perlindungan Seksyen Kritikal : Apabila sumber yang dikongsi perlu diubahsuai oleh pelbagai goroutin, Mutex
boleh digunakan untuk memastikan hanya satu goroutine yang dapat mengakses sumber pada satu masa. Sebagai contoh, meningkatkan kaunter bersama atau mengubahsuai struktur data bersama.
<code class="go">var counter int var mu sync.Mutex func incrementCounter() { mu.Lock() counter mu.Unlock() }</code>
Mutex
dapat memastikan langkah-langkah ini dilaksanakan secara atom. Sebagai contoh, membaca dan kemudian mengubahsuai peta yang dikongsi.sync.rwmutex:
Beban Kerja READ-HEAVY : Apabila terdapat banyak pembaca dan penulis yang lebih sedikit mengakses sumber yang dikongsi, RWMutex
boleh digunakan untuk membolehkan pelbagai goroutine dibaca secara serentak sambil memastikan akses eksklusif untuk penulis. Ini berguna dalam sistem caching atau hasil pertanyaan pangkalan data.
<code class="go">var cache map[string]string var rwmu sync.RWMutex func getFromCache(key string) string { rwmu.RLock() value := cache[key] rwmu.RUnlock() return value } func addToCache(key, value string) { rwmu.Lock() cache[key] = value rwmu.Unlock() }</code>
RWMutex
dapat meningkatkan prestasi dengan membenarkan pembacaan serentak tanpa memerlukan kunci eksklusif. Kedua -dua Mutex
dan RWMutex
adalah penting untuk menguruskan akses serentak kepada sumber yang dikongsi, tetapi memilih yang betul bergantung kepada corak akses tertentu dan keperluan prestasi aplikasi.
Beberapa fungsi dalam pakej sync
adalah penting untuk menguruskan penyegerakan goroutine. Inilah yang penting:
sync.mutex.lock () dan sync.mutex.unlock () : Fungsi -fungsi ini digunakan untuk mengunci dan membuka kunci mutex, memastikan akses eksklusif ke sumber yang dikongsi. Mereka sangat penting untuk mencegah keadaan kaum dalam program serentak.
<code class="go">var mu sync.Mutex mu.Lock() // Critical section mu.Unlock()</code>
sync.rwmutex.rlock () dan sync.rwmutex.runlock () : Fungsi -fungsi ini membolehkan akses bacaan bersama ke sumber, manakala sync.RWMutex.Lock()
dan sync.RWMutex.Unlock()
Pastikan akses tulis eksklusif. Mereka adalah penting untuk mengoptimumkan beban kerja bacaan.
<code class="go">var rwmu sync.RWMutex rwmu.RLock() // Read-only operations rwmu.RUnlock() rwmu.Lock() // Write operations rwmu.Unlock()</code>
sync.waitgroup.add (), sync.waitgroup.done (), dan sync.waitgroup.wait () : Fungsi -fungsi ini digunakan untuk menunggu koleksi goroutine selesai. Mereka adalah penting untuk menyelaraskan menyelesaikan pelbagai tugas serentak.
<code class="go">var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() // Goroutine work }() wg.Wait()</code>
Sync.once.do () : Fungsi ini memastikan bahawa fungsi yang diberikan hanya dilaksanakan sekali, walaupun dipanggil beberapa kali oleh goroutine serentak. Ia berguna untuk memulakan sumber bersama dengan selamat.
<code class="go">var once sync.Once once.Do(func() { // Initialization code })</code>
sync.cond.wait (), sync.cond.signal (), dan sync.cond.broadcast () : Fungsi -fungsi ini digunakan untuk menunggu dan memberi isyarat bersyarat. Mereka berguna untuk corak penyegerakan yang lebih kompleks di mana goroutin perlu menunggu syarat -syarat tertentu untuk dipenuhi sebelum meneruskan.
<code class="go">var cond sync.Cond cond.L.Lock() for conditionNotMet() { cond.Wait() } // Proceed with the operation cond.L.Unlock() // From another goroutine cond.L.Lock() conditionMet() cond.Signal() // or cond.Broadcast() cond.L.Unlock()</code>
Fungsi -fungsi ini membentuk tulang belakang penyegerakan goroutine dalam GO dan sangat diperlukan untuk menulis program serentak yang betul dan cekap.
Atas ialah kandungan terperinci Apakah pakej penyegerakan di Go? Apakah beberapa ciri utamanya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!