menuTicketing

Ticketing Go لائبریری

GitHub

ریپوزیٹری

مثال

بنیادی مثال

ایک سرور سے جڑ کر کلید حاصل کرنے اور فوراً واپس کرنے کی کم از کم مثال ہے۔ چونکہ Go میں async/await موجود نہیں، اس لیے بلاکنگ API کو بیک گراؤنڈ goroutine کے ساتھ ملا کر فراہم کیا جاتا ہے۔

go
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 اکاؤنٹ کے حساب سے لاک کے ذریعے باہمی اخراج کرتے ہوئے جمع/نکاسی دہرائیں تو بھی بیلنس ہمیشہ ابتدائی قدر پر واپس آتا ہے، اس کی تصدیق کرنے والی مثال ہے۔

go
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 میں ملاحظہ کریں۔