Вот пример программы:
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
, отвязываясь от порта.
Core
, так что вы исключили только одного из нескольких общих владельцев? - person Shepmaster   schedule 20.01.2018futures
. Если вы вызоветеforget()
наSpawnHandle
, он должен фактически отбросить его, что противоречит тому, что говорит документ. - person Stefan   schedule 21.01.2018