J'ai le code suivant:Comment faire pour abandonner l'environnement d'une fermeture passée à futures-cpupool?
extern crate futures;
extern crate futures_cpupool;
extern crate tokio_timer;
use std::time::Duration;
use futures::Future;
use futures_cpupool::CpuPool;
use tokio_timer::Timer;
fn work(foo: Foo) {
std::thread::sleep(std::time::Duration::from_secs(10));
}
#[derive(Debug)]
struct Foo { }
impl Drop for Foo {
fn drop(&mut self) {
println!("Dropping Foo");
}
}
fn main() {
let pool = CpuPool::new_num_cpus();
let foo = Foo { };
let work_future = pool.spawn_fn(|| {
let work = work(foo);
let res: Result<(),()> = Ok(work);
res
});
println!("Created the future");
let timer = Timer::default();
let timeout = timer.sleep(Duration::from_millis(750))
.then(|_| Err(()));
let select = timeout.select(work_future).map(|(win, _)| win);
match select.wait() {
Ok(()) => { },
Err(_) => { },
}
}
Il semble que ce code ne peut pas exécuter Foo::drop
- aucun message est imprimé.
Je m'attendais foo
à être abandonné dès que timeout
avenir se résout en select
, car c'est une partie de l'environnement d'une fermeture, passé à l'avenir abandonné.
Comment le faire exécuter Foo::drop
?
Il me semble que le 'foo' est utilisé dans un thread qui reste après la fin du programme. Cf. https://users.rust-lang.org/t/stopping-a-thread/6328. Je me demande si http://stackoverflow.com/questions/26199926/how-to-terminate-or-suspend-a-rust-thread-from-another-thread est suffisant pour répondre à votre question? – ArtemGr