上下文
我正在读到this blog页.提供了一些代码:
async fn parse_line(socket: &TcpStream) -> Result<String, Error> {
let len = socket.read_u32().await?;
let mut line = vec![0; len];
socket.read_exact(&mut line).await?;
let line = str::from_utf8(line)?;
Ok(line)
}
loop {
select! {
line_in = parse_line(&socket) => {
if let Some(line_in) = line_in {
broadcast_line(line_in);
} else {
// connection closed, exit loop
break;
}
}
line_out = channel.recv() => {
write_line(&socket, line_out).await;
}
}
}
作者声称,如果channel
在parse_line执行时收到一条消息,则parse_line
可能会以损坏状态结束.
问题
在什么时候parse_line
可以被打断?是在any点吗?根据我目前的理解--这可能是错误的--Rust可以在Await语句中切换线程上的任务,但在这些点上存储状态,以便可以继续工作.
我想像的是
我设想在parse_line
中,Rust将字节加载到line
变量中.在读取了一定数量的字节之后(对于某个ASCII字符,可能只有一半的字节),并且在等待更多字节进入时,channel
接收到一些东西,并且上下文切换.
完成channel.recv()
任务后,Rust返回读取输入,但是提供字节的用户取消了请求,现在没有其他内容可读取.
现在str::from_utf8(line)?
抛出UTF-8错误,因为line
具有不完整的ASCII字符.