многопоточку?
Есть такая структурка:
#[derive(Clone)]
struct AppState {
tx: broadcast::Sender<Snapshot>,
}
impl AppState {
fn run(self) {
let mut sys = System::new();
loop {
sys.refresh_cpu();
let v: Vec<_> = sys.cpus().iter().map(|cpu| cpu.cpu_usage()).collect();
let _ = self.tx.send(v);
std::thread::sleep(System::MINIMUM_CPU_UPDATE_INTERVAL);
}
}
}
И вот так она пишет данные, чтобы где-то их читать потом(например по веб-сокетам):
use tokio::sync::{broadcast, RwLock, RwLockReadGuard};
type Snapshot = Vec<f32>;
#[tokio::main]
async fn main() {
let (tx, _) = broadcast::channel::<Snapshot>(10);
let app_state = Arc::new(RwLock::new(AppState { tx: tx }));
let router = Router::new()
.route("/", get(root_get))
.route("/realtime/cpus", get(realtime))
.with_state(Arc::clone(&app_state));
tokio::task::spawn_blocking({
let arc_cloned = Arc::clone(&app_state);
move || {
arc_cloned.blocking_read().clone().run();
}
});
let server = Server::bind(&"0.0.0.0:5000".parse().unwrap()).serve(router.into_make_service());
println!("Server listening {}", server.local_addr());
server.await.unwrap();
}
Полностью уверен, что делаю всё не правильно (хоть оно и работает). Скорее всего данные нужно писать в deQueue, а потом их где-то так же писать в tx и только из него рассылать людям по сокетам. Смущает что tx не имплементит copy (и сделано это наверняка не просто так), а я беру и клоню структуру. Подскажите пожалуйста как можно сделать это правильнее...
а чего в spawn_blocking сразу не передать то, что нужно?
Я бы не оборачивал AppState в RwLock<> вообще, а наоставлял там только Receiver'ов всех цветов и расцветок (ну и mpsc Sender'ов, если оттуда нужно что-то отправлять).
Обсуждают сегодня