Rust 如何在多线程tokio中取消未来/关闭流?
基于东京的例子 我有一个修改过的版本,因此我可以按照以下方式处理每个连接的终止:Rust 如何在多线程tokio中取消未来/关闭流?,rust,tokio,Rust,Tokio,基于东京的例子 我有一个修改过的版本,因此我可以按照以下方式处理每个连接的终止: // Server will disconnect their side normally 8s later, from what I've observed let server_to_client = io::copy(&mut ro, &mut wi).map(|f| { server_session_time = server_start_time.elaps
// Server will disconnect their side normally 8s later, from what I've observed
let server_to_client = io::copy(&mut ro, &mut wi).map(|f| {
server_session_time = server_start_time.elapsed().unwrap();
f
});
// Normally, this will stop first, as the client disconnects as soon as he has the results...
let client_to_server = io::copy(&mut ri, &mut wo).map(|f| {
client_session_time = client_start_time.elapsed().unwrap();
f
});
// Join on both
match try_join(client_to_server, server_to_client).await {...}
这使我能够正确计算客户端的连接时间,因为客户端在收到应答后立即关闭连接,而代理服务器似乎需要(在我的情况下是8s)才能关闭。
考虑到这种代码结构,一旦我退出客户端到服务器的未来(即不等待我观察到需要关闭的8秒),是否有可能终止从服务器到客户端的下游连接
谢谢好的,再举几个例子,我能理解我必须做什么。 对于将来回到这个问题上来的任何人来说,需要的是根据tokio::select!的每个读写操作的4个未来,自己实现双向复制!。 这将允许访问所有流,当其中一个流终止时,您可以选择是否要完成对其他流的处理或只是停止。 如上所述,无法“取消”其他副本
您可以查看io::copy和tokio::select的实现,以构建您的4路选择。4路是什么意思。即使只有2对对半,这怎么可能呢?2对对半,意味着两个未来等待从两台主机读取,两个未来等待从同一台主机写入,因此使3。
// Server will disconnect their side normally 8s later, from what I've observed
let server_to_client = io::copy(&mut ro, &mut wi).map(|f| {
server_session_time = server_start_time.elapsed().unwrap();
f
});
// Normally, this will stop first, as the client disconnects as soon as he has the results...
let client_to_server = io::copy(&mut ri, &mut wo).map(|f| {
client_session_time = client_start_time.elapsed().unwrap();
f
});
// Join on both
match try_join(client_to_server, server_to_client).await {...}