为什么一个 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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...