menuTicketing
close





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")

কনকারেন্সি উদাহরণ (ডিস্ট্রিবিউটেড লক)

একাধিক goroutine অ্যাকাউন্ট-ভিত্তিক লক দিয়ে পারস্পরিক বর্জন বজায় রেখে জমা/উত্তোলন বারবার করলেও ব্যালেন্স সবসময় শুরুর মানে ফিরে আসে কিনা যাচাই করার উদাহরণ।

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-এ দেখুন।