use cached::stores::ExpiringSizedCache; use std::sync::Arc; use std::time::Duration; use tokio::sync::RwLock; use web_time::Instant; #[tokio::main] async fn main() { let mut cache = ExpiringSizedCache::new(20_000); cache.size_limit(100); let cache = Arc::new(RwLock::new(cache)); let write_cache = cache.clone(); let write_handle = tokio::spawn(async move { for _ in 0..10 { { let mut cache = write_cache.write().await; cache .insert("A".to_string(), "A".to_string()) .expect("write failure"); println!("[expiring_sized] wrote to cache"); } tokio::time::sleep(Duration::from_millis(500)).await; } }); let mut read_handles = vec![]; for i in 0..5 { let reader = i + 1; let read_cache = cache.clone(); let read_handle = tokio::spawn(async move { tokio::time::sleep(Duration::from_millis(100)).await; let start = Instant::now(); let mut count = 0; while Instant::now().duration_since(start) < Duration::from_millis(5_000) { let cache = read_cache.read().await; assert_eq!(cache.get_borrowed("A"), Some(&"A".to_string())); count += 1; if count % 1_000_000 == 0 { println!("[expiring_sized] read 1M times in reader {}", reader); } } }); read_handles.push(read_handle); } write_handle.await.expect("error in write loop"); for (i, h) in read_handles.into_iter().enumerate() { h.await .map_err(|e| format!("error in read handle {}: {:?}", i + 1, e)) .unwrap(); } }