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 {...}