multithreading - 为什么一个 actix_web::rt 未来在另一个处于活动状态时被丢弃,为什么另一个从未被丢弃?
问题描述
我对 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();
}
})
}
...
}
...
我想要内在的未来watch
和spawn_ping
燃烧的未来。然而,watch
当接收到文件内容事件时触发,spawn_ping
仅在watch
被注释掉时触发(即何时spawn_ping
是唯一的未来运行)。我没有看到任何错误消息。
我相信这个问题可以通过将这些任务中的一个或两个放在后面来解决std::thread
,但是我相信我想使用actix_web::rt::spawn
它,因为它是基于 tokio 构建的,它更适合在几个线程上运行的许多小任务。我正在寻求了解为什么这没有按预期工作。
解决方案
推荐阅读
- elasticsearch - Grafana 与 Elasticsearch - 不显示指标/日志切换器
- python - Pandas DataFrames:有效地在一列中找到下一个值,而另一列的值更大
- excel - 进行更改时突出显示单元格
- javascript - 为什么我在画布右侧的绘图会改变画布左侧的像素?
- apache-beam - 在 Apache Beam 中将参数放入 DoFn 的 onElement 方法的最佳方法
- r - 在 R 中的特定列上求和 NA
- git - Gitlab 显示的提交作者与 git config --global user.name 不同
- flutter - 是否有 Flutter 包来计算和绘制使用墨卡托投影的地图中的最短路径?
- python - 有没有办法解决 FORBIDDEN FOR url?
- python - 使用 python 从 S3 显示图像