gpt4 book ai didi

rust - 如何在 Rust 中以异步方式运行另一个函数?

转载 作者:行者123 更新时间:2023-12-03 11:48:34 25 4
gpt4 key购买 nike

作为一名 JS 开发者,我真的很难理解 Rust 中的错误处理。特别是异步性。下面是来自另一个 stackoverflow 问题的一些代码,使用 async-std 调用异步抓取器函数:

use std::fs::File;
use std::io::{self, BufReader};
use std::io::BufRead;
//use async_std::task;

async fn scrape<R: BufRead>(reader: &mut R) -> io::Result<()> {
reader.lines()
.try_for_each(|line_result| line_result.and_then(|line| Ok(println!("{}", line))))?;
Ok(())
}

fn main() {
let file_result = File::open("wlist.txt");
let file;
match file_result {
Ok(f) => file = f,
Err(e) => { println!("File open error! {}", e); return; },
}
let mut reader = BufReader::new(file);

match scrape(&mut reader) {
Ok(_) => println!("done!"),
Err(e) => println!("File read error! {}", e),
}
}

我正在尝试以异步方式调用 scrape,例如:

    task::block_on(match scrape(&mut reader) {
Ok(_) => println!("done!"),
Err(e) => println!("File read error! {}", e),
})

但是它出错了特征 std::future::Future 没有为 () 实现

代码片段有什么问题?我怎样才能以异步方式运行 scraper,同时尽可能少地修改其余代码?

最佳答案

通常您只能从异步上下文中调用异步函数,除非您使用 block_onspawn 函数或您的执行程序中的类似函数。

创建异步上下文的最简单方法是使用 async block 。然后您需要使用 .await 运算符来正确链接异步:

    task::block_on(async {
match scrape(&mut reader).await {
Ok(_) => println!("done!"),
Err(e) => println!("File read error! {}", e),
}
})

对于更复杂的代码,您将有一个可能会失败的异步函数调用另一个也可能会失败的异步函数。在这些情况下,编写 other_async_func().await? 来等待并同时转发错误是惯用的。

关于rust - 如何在 Rust 中以异步方式运行另一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62118299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com