如何使用 TcpStream 拆分到 2 个线程和异步?



我正在尝试在不同的线程中使用tcp流的读写。这是我目前拥有的:

use tokio::prelude::*;
use tokio::net::TcpStream;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut stream = TcpStream::connect("localhost:8080").await?;
let (mut read, mut write) = stream.split();
tokio::spawn(async move {
loop {
let mut buf = [0u8; 32];
read.read(&mut buf).await.unwrap();
println!("{}", std::str::from_utf8(&buf));
}
});
Ok(())
}

我将使用另一个线程进行写入。我的问题是我收到错误,即"流"在仍然借用时被丢弃。

这是由于Tokio::split的方法签名而发生的,正如你所看到的它需要&mut self,所以由于'static边界,它的一部分不能用于tokio::spawn未来的参数中。所以,这正是错误所说的。

您正在搜索的是tokio::io::split.操场

use tokio::prelude::*;
use tokio::net::TcpStream;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut stream = TcpStream::connect("localhost:8080").await?;
let (mut read, mut write) = tokio::io::split(stream);
tokio::spawn(async move {
loop {
let mut buf = [0u8; 32];
read.read(&mut buf).await.unwrap();
println!("{:?}", std::str::from_utf8(&buf));
}
});
Ok(())
}

阅读 https://users.rust-lang.org/t/why-i-have-to-use-tokio-tcpstream-split-for-concurrent-read-writes/47755/3 它建议使用into_split它更有效率。

tokio::io::split使用into_split显然没有的Mutex(特定于TcpStream(

最新更新