比较rust中异步操作的句柄与流

q3qa4bjr  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(138)

在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
  • 除了在流版本中不发生的句柄向量的构建之外,这两个版本是相同的吗?我的意思是,它们都是基于绿色线程吗?
jdzmm42g

jdzmm42g1#

是的,这是可行的:

fn main() {
    let delta = 3;
    let cont = Cont { delta };
    let stream = futures::stream::iter(0..10).then(move |i| {
        let mut cont = cont.clone();
        async move { cont.get() + i.clone() }
    });
    let _result: Vec<usize> = stream.collect().await;
}

基本上,只需克隆闭包中的cont,然后将其移动到async块中。
是的,它们在功能上是等同的。

相关问题