Bagaimana untuk Melaksanakan Penguncian dengan Tamat Masa dalam Go menggunakan Saluran?

Mary-Kate Olsen
Lepaskan: 2024-10-31 00:31:29
asal
952 orang telah melayarinya

How to Implement Locking with Timeouts in Go using Channels?

Mengunci dengan Tamat Masa dalam Go

Cabaran:

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.

Penyelesaian:

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>
Salin selepas log masuk

Mengunci:

Untuk memperoleh kunci, hantar isyarat kepada saluran:

<code class="go">l <- struct{}{}</code>
Salin selepas log masuk

Membuka kunci:

Untuk melepaskan kunci, terima daripada saluran:

<code class="go"><-l</code>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!