清除stdin的现有实例.Read_line在rust中



我正在尝试从控制台读取输入行。我使用async_std crate来读取这些行。

stdin.readline在多个地方被调用。

是否有一种方法可以取消或刷新stdin.read_line的前一个实例,在调用尝试再次读取stdin.read_line之前?

锈代码:

let create_spawn = async move {
let stdin = io::stdin();
let mut input_line = String::new();

let r = stdin.read_line(&mut input_line);
let l = r.await?;

log::debug!("received the input line: {}", input_line);
Ok::<(), anyhow::Error>(())
};
let c1 = tokio::spawn(create_spawn);
delay();
// <---cancel the previous instance of `stdin.read_line` --->
let c2 = tokio::spawn(create_spawn);

您提到您使用的是async_std,但您的样品也使用tokio

简化你的程序以使用async-std,并应用一点艺术许可:

use async_std::{io, task};
use std::{thread::sleep, time::Duration};
async fn read_from_stdin() -> io::Result<()> {
let stdin = io::stdin();
let mut input_line = String::new();
println!("Waiting for input");
let r = stdin.read_line(&mut input_line);
let n = r.await?;

println!("received the input line ({} bytes): {}", n, input_line);
Ok(())
}
fn main() {
let c1 = task::spawn(read_from_stdin());
sleep(Duration::from_secs(10));
task::block_on(c1.cancel());
println!("Cancelled Input!n");
let c2 = task::spawn(read_from_stdin());

sleep(Duration::from_secs(10));
}

你不能生成相同的未来两次,所以我将你的create_spawn移动到一个名为read_from_stdin的异步函数中。每次调用该函数时,它将返回一个future,当从stdin中读取一行时结束。

调用task::spawn返回一个JoinHandle,这暴露了一个cancel方法,该方法允许您取消已生成的任务。然后,您可以生成一个新任务来从stdin中读取。

相关内容

  • 没有找到相关文章

最新更新