Почему удаление этого SpawnHandle не отменяет его будущее?

Вот пример программы:

extern crate futures;
extern crate tokio_core;

use futures::{Async, Future, Stream};
use tokio_core::reactor::Core;
use tokio_core::net::TcpListener;

fn main() {
    let mut core = Core::new().unwrap();

    futures::sync::oneshot::spawn(
        TcpListener::bind(&"127.0.0.1:5000".parse().unwrap(), &core.handle())
            .unwrap()
            .incoming()
            .for_each(|_| {
                println!("connection received");
                Ok(())
            }),
        &core,
    );

    let ft = futures::future::poll_fn::<(), (), _>(|| {
        std::thread::sleep_ms(50);
        Ok(Async::NotReady)
    });

    core.run(ft);
}

Как видите, я вызываю oneshot::spawn, а затем сразу же отбрасываю его возвращаемое значение, что теоретически должно отменить будущее, содержащееся внутри. Однако, когда я запускаю эту программу, а затем подключаюсь к 127.0.0.1:5000, она все равно печатает «соединение получено». Почему это происходит? Я ожидал, что он ничего не напечатает и сбросит TcpListener, отвязываясь от порта.


person sdlkjslfie    schedule 20.01.2018    source источник
comment
Может ли быть так, что будущее зарегистрировалось в Core, так что вы исключили только одного из нескольких общих владельцев?   -  person Shepmaster    schedule 20.01.2018
comment
Я предполагаю, что это связано с моим ответом в stackoverflow.com/questions/48359296/ - извините, что не проверил его. Я посмотрю на это.   -  person Stefan    schedule 21.01.2018
comment
Это перевернутая логическая ошибка в futures. Если вы вызовете forget() на SpawnHandle, он должен фактически отбросить его, что противоречит тому, что говорит документ.   -  person Stefan    schedule 21.01.2018


Ответы (1)


Это (уже исправлено) ошибка в futures ящике; версия 0.1.18 должна включать исправление.

Он использовал инвертированные значения для keep_running: bool в SpawnHandle/Executor.

person Stefan    schedule 21.01.2018