如何解决为什么一个 actix_web::rt 未来在另一个活跃时被丢弃,为什么另一个从未被丢弃?
我对 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 举报,一经查实,本站将立刻删除。