0

我对 rust 有点陌生,但我开始了解线程生态系统的某些部分。我很难解决以下问题。作为参考,我的代码库在这里(后端/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 构建的,它更适合在几个线程上运行的许多小任务。我正在寻求了解为什么这没有按预期工作。

4

0 回答 0