Corak Penguncian Timbal dalam Go
Dalam Go, saluran penimbal membenarkan komunikasi diteruskan tanpa menyekat sehingga penimbalnya terisi. Walau bagaimanapun, adakah terdapat corak serupa untuk kunci penimbal yang mengehadkan akses sumber kepada bilangan pelanggan tertentu?
Primitif untuk mengurus akses serentak kepada sumber ialah semaphore. Semaphore boleh dilaksanakan dengan mudah menggunakan saluran buffered.
Ini contohnya:
var semaphore = make(chan struct{}, 4) // allow four concurrent users func f() { // Grab the lock. Blocks if 4 other concurrent invocations of f are running. semaphore <- struct{}{} // Release the lock when the function is done. defer func() { <-semaphore }() // Perform the intended operations... }
Dalam contoh ini, semaphore dengan penimbal saiz 4 dicipta menggunakan semaphore := make( chan struct{}, 4). Fungsi f() cuba mendapatkan kunci dengan menghantar struct kosong ke saluran. Jika penimbal saluran penuh (iaitu, 4 kejadian serentak f() sudah berjalan), panggilan ke semaphore <- struct{}{} menyekat sehingga kunci tersedia.
Apabila fungsi selesai tugasnya, ia melepaskan kunci dengan mendapatkan semula struct kosong daripada saluran (- Corak ini menyediakan cara yang mudah untuk menyekat akses kepada sumber yang dikongsi kepada bilangan pelanggan serentak tertentu, menghalang isu perbalahan sumber yang berpotensi. Atas ialah kandungan terperinci Adakah Terdapat Corak Penguncian Tertimbal dalam Go Serupa dengan Saluran Tertimbal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!