问题描述
我对 Rust 有点陌生,但我开始了解线程生态系统的某些部分。我很难解决以下问题。作为参考,我的代码库是 here(backend/broadcaster.rs 中的问题)。
我有一个 Broadcaster
提供服务器发送的事件。重要的片段看起来像这样
...
impl Broadcaster {
pub fn create(file_content_receiver: StdReceiver<String>) -> Data<Mutex<Self>> {
let me = Data::new(Mutex::new(Broadcaster::new()));
Broadcaster::spawn_ping(me.clone());
Broadcaster::watch(me.clone(),file_content_receiver);
me
}
fn new() -> Self {
Broadcaster {
clients: Vec::new(),}
}
fn watch(me: Data<Mutex<Self>>,file_content_receiver: StdReceiver<String>) {
actix_web::rt::spawn(async move {
loop {
match file_content_receiver.recv() {
Ok(string) => me.lock().unwrap().send(string.as_str()),Err(e) => me.lock().unwrap().send(e.to_string().as_str()),}
}
})
}
fn spawn_ping(me: Data<Mutex<Self>>) {
actix_web::rt::spawn(async move {
let mut task = interval_at(Instant::now(),Duration::from_secs(10));
while task.next().await.is_some() {
me.lock().unwrap().remove_stale_clients();
}
})
}
...
}
...
我希望 watch
和 spawn_ping
内的未来都被触发。然而,当收到文件内容事件时 watch
会触发,而 spawn_ping
仅在 watch
被注释掉时触发(即当 spawn_ping
是唯一的未来运行时)。我没有看到任何错误消息。
我相信可以通过将这些任务中的一项或两项放在 std::thread
后面来解决该问题,但是我相信我想使用 actix_web::rt::spawn
,因为它是基于 tokio 构建的,它更适合于许多小任务在几个线程上运行。我想了解为什么这不能按预期工作。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)