Rumah >pembangunan bahagian belakang >Golang >Mekanisme penyegerakan dan penyelesaian pengoptimuman kesesakan prestasi di Golang
Penyelesaian pengoptimuman untuk mekanisme penyegerakan dan kesesakan prestasi di Golang
package main import ( "fmt" "sync" ) var ( count int lock sync.Mutex ) func increment() { lock.Lock() defer lock.Unlock() count++ } func main() { var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() increment() }() } wg.Wait() fmt.Println(count) }
Pembolehubah bersyarat digunakan untuk berkomunikasi antara coroutine dan melaksanakan coroutines dan bangun-. mekanisme naik. Apabila coroutine memenuhi syarat tertentu, anda boleh menggunakan pembolehubah keadaan untuk memberitahu coroutine lain. Berikut ialah kod sampel menggunakan pembolehubah keadaan:
package main import ( "fmt" "sync" ) var ( ready bool cond *sync.Cond ) func init() { cond = sync.NewCond(&sync.Mutex{}) } func printNumbers() { cond.L.Lock() defer cond.L.Unlock() for !ready { cond.Wait() } fmt.Println("1 2 3 4 5") } func main() { go printNumbers() cond.L.Lock() ready = true cond.Signal() cond.L.Unlock() }2.3 Kunci baca-tulis (RWMutex)
Kunci baca-tulis boleh meningkatkan lagi prestasi atur cara serentak. Dalam senario yang terdapat banyak bacaan dan sedikit tulisan, menggunakan kunci baca-tulis boleh membenarkan berbilang coroutine membaca sumber yang dikongsi pada masa yang sama, manakala hanya satu coroutine boleh melakukan operasi tulis. Berikut ialah kod sampel menggunakan kunci baca-tulis:
package main import ( "fmt" "sync" ) var ( count int lock sync.RWMutex ) func read() { lock.RLock() defer lock.RUnlock() fmt.Println(count) } func write() { lock.Lock() defer lock.Unlock() count++ } func main() { var wg sync.WaitGroup wg.Add(10) for i := 0; i < 5; i++ { go func() { defer wg.Done() read() }() go func() { defer wg.Done() write() }() } wg.Wait() }
Apabila menggunakan kunci mutex, anda boleh meminimumkan kebutiran kunci dan hanya mengunci segmen kod bahagian kritikal yang diperlukan. Ini mengurangkan perbalahan kunci. Apabila menggunakan kunci baca-tulis, anda boleh memilih kunci baca atau kunci tulis mengikut situasi sebenar untuk menggunakan sepenuhnya ciri-ciri bacaan selari.
Untuk senario konkurensi tinggi, anda boleh mempertimbangkan untuk menggunakan struktur data tanpa kunci, seperti fungsi operasi atom dalam pakej atom. Fungsi ini menyediakan beberapa operasi atom tanpa menggunakan kunci untuk memastikan ketekalan data. Contohnya, gunakan atomic.AddInt64() dan bukannya mutex untuk memastikan pengiraan yang konsisten.
Saluran boleh digunakan sebagai mekanisme penyegerakan untuk memastikan susunan dan ketekalan capaian data. Dalam sesetengah senario, menggunakan saluran boleh mengelakkan penggunaan kunci mutex secara eksplisit, dengan itu mengurangkan perbalahan kunci. Walau bagaimanapun, perhatian perlu diberikan kepada kapasiti saluran dan overhed prestasi untuk mengelakkan sekatan atau kebocoran memori.
Atas ialah kandungan terperinci Mekanisme penyegerakan dan penyelesaian pengoptimuman kesesakan prestasi di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!