Mengunci dengan Tamat Masa dalam Go
Mendapatkan kunci dalam Go boleh menjadi masalah, terutamanya apabila menangani kependaman -operasi sensitif. Antara muka penyegerakan.Mutex hanya menyediakan fungsi penguncian dan buka kunci asas tanpa keupayaan untuk memperoleh kunci secara bersyarat atau dalam jangka masa tertentu.
Menggunakan Saluran sebagai Mutex:
Penyelesaian yang mudah dan berkesan ialah menggunakan saluran sebagai primitif pengecualian bersama. Dengan mencipta saluran dengan saiz penimbal satu, anda boleh mensimulasikan kunci:
<code class="go">l := make(chan struct{}, 1)</code>
Mengunci:
Untuk memperoleh kunci, hantar isyarat kepada saluran:
<code class="go">l <- struct{}{}</code>
Membuka kunci:
Untuk melepaskan kunci, terima daripada saluran:
<code class="go"><-l</code>
Cuba Kunci:
Untuk cuba mengunci dengan tamat masa, gunakan pernyataan pilih:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l default: // lock not acquired }</code>
Dengan menggabungkan pendekatan ini dengan masa.Selepas(), anda boleh melaksanakan TryLock dengan tarikh akhir:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l case <-time.After(time.Minute): // lock not acquired }</code>
Contoh 1: Mengehadkan Operasi Sensitif Latensi
<code class="go">func (s *RPCService) DoTheThing(ctx context.Context, ...) ... { if AcquireLock(ctx.Deadline(), &s.someObj[req.Parameter].lock) { defer ReleaseLock(&s.someObj[req.Parameter].lock) ... expensive computation ... } else { return s.cheapCachedResponse[req.Parameter] } }</code>
Contoh 2: Mengemas kini Statistik dengan Tamat Masa
<code class="go">func (s *StatsObject) updateObjStats(key, value interface{}) { if AcquireLock(200*time.Millisecond, &s.someObj[key].lock) { defer ReleaseLock(&s.someObj[key].lock) ... update stats ... ... fill in s.cheapCachedResponse ... } } func (s *StatsObject) UpdateStats() { s.someObj.Range(s.updateObjStats) }</code>
Pendekatan ini membolehkan anda memperoleh kunci secara bersyarat sambil turut mengendalikan masalah prestasi dan penggunaan sumber dengan berkesan.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Penguncian dengan Tamat Masa dalam Go menggunakan Saluran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!