Как отменить будущий / закрытый поток в многопоточном токио? - PullRequest
0 голосов
/ 02 мая 2020

На основе примера Токио в https://github.com/tokio-rs/tokio/blob/master/examples/proxy.rs

let (mut ri, mut wi) = inbound.split();
let (mut ro, mut wo) = outbound.split();

let client_to_server = io::copy(&mut ri, &mut wo);
let server_to_client = io::copy(&mut ro, &mut wi);

try_join(client_to_server, server_to_client).await?;

Ok(())

У меня есть измененная версия, чтобы я мог обрабатывать завершение каждого соединения, как в:

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

Это позволило мне правильно рассчитать время соединения для клиентской стороны, так как клиенты сразу закрывают соединение при получении ответа, в то время как прокси-сервер, кажется, берет (в моем случае 8), чтобы закрыть. Учитывая эту структуру кода, есть ли возможность разорвать нисходящее соединение с server_to_client, как только я выйду из будущего client_to_server (то есть не буду ждать 8 секунд, которые, как я наблюдаю, требуется для завершения работы)?

Спасибо

1 Ответ

0 голосов
/ 04 мая 2020

Хорошо, с еще несколькими примерами, смог понять, что я должен был сделать. Для любых людей, которые вернутся к этому вопросу в будущем, необходимо, чтобы вы внедрили двунаправленную копию самостоятельно, основываясь на 4 фьючерсах каждого из операций чтения и записи, с помощью tokio :: select !. Это позволит получить доступ ко всем потокам, и когда один из них завершается, вы можете завершить обработку остальных потоков или просто остановиться. Как указано выше, нет способа «отменить» «другую» копию ...

. Вы можете посмотреть как на реализацию io :: copy https://github.com/tokio-rs/tokio-io/blob/master/src/copy.rs, так и на tokio: : выберите https://docs.rs/tokio/0.2.20/tokio/macro.select.html, чтобы построить свой 4-х сторонний выбор.

...