self, add: i32) {
let minute = Self::now_minute();
if minute == self.minute {
self.used += add;
} else {
self.minute = minute;
self.used = add;
}
}, наверное было бы наиболее понятно менять через вот этот интерфейс. Только как его правильно с работников вызывать? (и лучший ли это вариант в принципе)
Так, чтоли, делать? pub struct RateLimit { minute: Mutex<String>, used: AtomicI32, } impl RateLimit { pub fn new() -> Self { let minute = Mutex::new(Self::now_minute()); let used = AtomicI32::new(0); RateLimit { minute, used } } pub fn now_minute() -> String { Utc::now().format("%Y-%m-%d %H:%M").to_string() } pub async fn update(&self, add: i32) { let current_minute = Self::now_minute(); let mut minute_guard = self.minute.lock().unwrap(); if *minute_guard == current_minute { self.used.fetch_add(add, Ordering::Relaxed); } else { *minute_guard = current_minute; self.used.store(add, Ordering::Relaxed); } } }
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=937bbd0178deb76f78da457c25e71904
Обсуждают сегодня