menuTicketing

Ticketing Rust لائبریری

GitHub

ریپوزیٹری

مثال

بنیادی مثال

Tokio پر مبنی غیر ہم وقت (async) API ہے۔ ایک سرور سے جڑ کر کلید حاصل کرتا ہے اور فوراً واپس کر دیتا ہے۔

rust
use std::time::Duration;
use ticketing::TicketBroker;

let broker = TicketBroker::connect(["127.0.0.1:5225"]);
broker.wait_ready(Duration::from_secs(5)).await;

let wait = Duration::from_secs(5);
let lease = Duration::from_secs(30);

let ticket = broker.acquire("key", wait, lease).await.unwrap();
ticket.release().await.unwrap();

println!("pass");

ہم آہنگی کی مثال (ڈسٹری بیوٹڈ لاک)

متعدد ٹاسکس اکاؤنٹ کے حساب سے لاک کے ذریعے باہمی اخراج کرتے ہوئے جمع/نکاسی دہرائیں تو بھی بیلنس ہمیشہ ابتدائی قدر پر واپس آتا ہے، اس کی تصدیق کرنے والی مثال ہے۔ TicketBroker کو Clone کیا جا سکتا ہے اس لیے متعدد ٹاسکس میں شیئر ہوتا ہے۔

rust
async fn transaction(broker: &TicketBroker, account: usize, delta: i64) {
    let key = format!("account-{account}");

    let _ticket = match broker.acquire(&key, WAIT, LEASE).await {
        Ok(ticket) => Some(ticket),
        Err(e) => {
            tracing::error!("account {account} acquire failed: {e}");
            return;
        }
    };

    // جب ہم لاک رکھے ہوں تو محفوظ نازک حصہ
    let before = balances[account];
    tokio::task::yield_now().await;
    balances[account] = before + delta;

    // ticket کو drop کرنے سے پس منظر میں خود بخود واپس کیا جاتا ہے (اگر فوری واپسی ضروری نہیں تو چھوڑا جا سکتا ہے)
    let (action, sign) = if delta < 0 { ("withdraw", '-') } else { ("deposit", '+') };
    tracing::info!("account {account} {action} {sign}${AMOUNT} -> ${}", balances[account]);
}

مکمل مثال tests/example_simple.rs, tests/example_bank.rs, tests/bench_test.rs میں ملاحظہ کریں۔