gpt4 book ai didi

rust - 如何使用 TcpStream 拆分为 2 个异步线程?

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

我正在尝试在不同的线程中使用 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 , 所以它的部分不能用于 tokio::spawn由于 'static 的 future 争论边界。所以,这正是错误所说的。

您搜索的是 tokio::io::split . Playground

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(())
}

关于rust - 如何使用 TcpStream 拆分为 2 个异步线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62220109/

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