Tokio आधारित असिंक्रोनस API है। एक सर्वर से जुड़कर key अधिग्रहीत की जाती है और तुरंत रिलीज़ कर दी जाती है।
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 किया जा सकता है इसलिए कई टास्क में साझा किया जाता है।
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;
// जब टिकट को ड्रॉप किया जाता है, तो यह पृष्ठभूमि में स्वचालित रूप से जारी किया जाता है (यदि तुरंत रिलीज़ की आवश्यकता नहीं है तो छोड़ा जा सकता है)
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 में देखें।