为什么放弃这个 SpawnHandle 不会取消它的未来?
Why doesn't dropping this SpawnHandle cancel its future?
这是一个示例程序:
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
然后立即删除了它的 return 值,理论上应该取消其中包含的未来。但是,当我 运行 这个程序然后连接到 127.0.0.1:5000
时,它仍然打印 "connection received." 为什么要这样做?我预计它不会打印任何内容并删除 TcpListener
,从端口解除绑定。
这是一个(现已修复)bug in the futures
crate;版本 0.1.18
应该包含修复程序。
它在 SpawnHandle
/Executor
中使用了 keep_running: bool
的反转值。
这是一个示例程序:
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
然后立即删除了它的 return 值,理论上应该取消其中包含的未来。但是,当我 运行 这个程序然后连接到 127.0.0.1:5000
时,它仍然打印 "connection received." 为什么要这样做?我预计它不会打印任何内容并删除 TcpListener
,从端口解除绑定。
这是一个(现已修复)bug in the futures
crate;版本 0.1.18
应该包含修复程序。
它在 SpawnHandle
/Executor
中使用了 keep_running: bool
的反转值。