微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么一个 actix_web::rt 未来在另一个活跃时被丢弃,为什么另一个从未被丢弃?

如何解决为什么一个 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();
            }
        })
    }

    ...
}
...

我希望 watchspawn_ping 内的未来都被触发。然而,当收到文件内容事件时 watch 会触发,而 spawn_ping 仅在 watch 被注释掉时触发(即当 spawn_ping 是唯一的未来运行时)。我没有看到任何错误消息。

我相信可以通过将这些任务中的一项或两项放在 std::thread 后面来解决该问题,但是我相信我想使用 actix_web::rt::spawn,因为它是基于 tokio 构建的,它更适合于许多小任务在几个线程上运行。我想了解为什么这不能按预期工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。