ایک سرور سے جڑ کر کلید حاصل کرنے اور فوراً واپس کرنے کی کم از کم مثال ہے۔ چونکہ Go میں async/await موجود نہیں، اس لیے بلاکنگ API کو بیک گراؤنڈ goroutine کے ساتھ ملا کر فراہم کیا جاتا ہے۔
wait := 5 * time.Second
lease := 30 * time.Second
broker := Connect("127.0.0.1:5225")
defer broker.Close()
broker.WaitReady(5 * time.Second)
ticket, err := broker.Acquire("key", wait, lease)
if err != nil {
log.Fatalf("acquire: %v", err)
}
if _, err := ticket.Release(); err != nil {
log.Fatalf("release: %v", err)
}
fmt.Println("pass")متعدد goroutines اکاؤنٹ کے حساب سے لاک کے ذریعے باہمی اخراج کرتے ہوئے جمع/نکاسی دہرائیں تو بھی بیلنس ہمیشہ ابتدائی قدر پر واپس آتا ہے، اس کی تصدیق کرنے والی مثال ہے۔
transaction := func(account int, delta int64) {
key := fmt.Sprintf("account-%d", account)
ticket, err := broker.Acquire(key, bankWait, bankLease)
if err != nil {
log.Printf("account %d acquire failed: %v", account, err)
return
}
before := balances[account]
runtime.Gosched()
after := before + delta
balances[account] = after
ticket.Close() // بیک گراؤنڈ میں خود بخود واپسی
action, sign := "deposit", "+"
if delta < 0 {
action, sign = "withdraw", "-"
}
log.Printf("account %d %s %s$%d -> $%d", account, action, sign, bankAmount, after)
}مکمل مثال example_test.go، bank_example_test.go، bench_test.go میں ملاحظہ کریں۔