在rust中,我们可以编写一个句柄向量,允许在不阻塞的情况下进行异步操作:
use tokio;
#[derive(Clone)]
struct Cont {
delta: usize,
}
impl Cont {
fn get(&mut self) -> usize {
self.delta
}
}
#[tokio::main]
async fn main() {
let delta = 3;
let cont = Cont { delta };
let mut handles = Vec::new();
for i in 0..10 {
let mut cont = cont.clone();
handles.push(tokio::spawn(async move {
cont.get() + i.clone()
}));
}
let _response = futures::future::join_all(handles).await;
}
但是这构建了一个句柄向量,可能被认为是否定的。
流版本将用
#[tokio::main]
async fn main() {
let delta = 3;
let cont = Cont { delta };
let stream = stream::iter(0..10).then(|i| async move {
cont.clone().get() + i.clone()
});
let _result : Vec<usize> = stream.collect().await;
}
不幸的是,它不编译。
所以我的问题如下:
- 有没有可能让流版本的代码正确工作,也就是说,有没有办法克隆
cont
? - 除了在流版本中不发生的句柄向量的构建之外,这两个版本是相同的吗?我的意思是,它们都是基于绿色线程吗?
1条答案
按热度按时间jdzmm42g1#
是的,这是可行的:
基本上,只需克隆闭包中的cont,然后将其移动到async块中。
是的,它们在功能上是等同的。