Mendapatkan Kunci dengan Tarikh Akhir dalam Go
Dalam Go, jenis penyegerakan.Mutex hanya menyediakan kaedah Lock() dan Unlock(). Untuk senario di mana pemerolehan kunci harus dicuba dalam tempoh tarikh akhir, atau berkemungkinan dibatalkan serta-merta, tiada penyelesaian terbina dalam.
Cadangan Penyelesaian: Salurkan sebagai Mutex
Pendekatan alternatif ialah menggunakan saluran dengan saiz penimbal satu untuk mensimulasikan mutex. Dengan menghantar dan menerima satu nilai struct kosong (struct{}{}), operasi kunci dan buka kunci boleh dilakukan.
Kunci:
<code class="go">l := make(chan struct{}, 1) l <- struct{}{}</code>
Buka Kunci:
<code class="go"><-l</code>
Cuba Kunci:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l default: // lock not acquired }</code>
Cuba Kunci dengan Tamat Masa:
<code class="go">select { case l <- struct{}{}: // lock acquired <-l case <-time.After(time.Minute): // lock not acquired }</code>
Dalam contoh yang diberikan, s.someObj diandaikan sebagai peta daripada kunci kepada nilai.
Contoh 1: LockBefore() untuk Kod Sensitif Latensi
<code class="go">// DoTheThing locks before performing expensive computations. func (s *RPCService) DoTheThing(ctx context.Context, ...) ... { l := make(chan struct{}, 1) select { case l <- struct{}{}: defer <-l ... expensive computation based on internal state ... default: return s.cheapCachedResponse[req.Parameter] } }</code>
Contoh 2: TryLock() untuk Mengemas kini Statistik
<code class="go">// updateObjStats attempts to lock and update stats. func (s *StatsObject) updateObjStats(key, value interface{}) { l := make(chan struct{}, 1) select { case l <- struct{}{}: defer <-l ... update stats ... ... fill in s.cheapCachedResponse ... default: // skip locked object } } // UpdateStats attempts to lock and update stats for all objects. func (s *StatsObject) UpdateStats() { s.someObj.Range(s.updateObjStats) }</code>
Atas ialah kandungan terperinci Bagaimana untuk Memperoleh Kunci dengan Tarikh Akhir dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!