Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Memperoleh Kunci dengan Tarikh Akhir dalam Go?

Bagaimana untuk Memperoleh Kunci dengan Tarikh Akhir dalam Go?

Patricia Arquette
Lepaskan: 2024-10-29 15:22:02
asal
648 orang telah melayarinya

How to Acquire a Lock with a Deadline in Go?

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

Buka Kunci:

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

Cuba Kunci:

<code class="go">select {
case l <- struct{}{}:
    // lock acquired
    <-l
default:
    // lock not acquired
}</code>
Salin selepas log masuk

Cuba Kunci dengan Tamat Masa:

<code class="go">select {
case l <- struct{}{}:
    // lock acquired
    <-l
case <-time.After(time.Minute):
    // lock not acquired
}</code>
Salin selepas log masuk

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

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

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!

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