Да, значения, которые были созданы , будут отброшены.
В вашем первом примере будущее, возвращаемое f
, никогда не начинается, поэтому S
никогда не создается. Это означает, что оно не может быть удалено.
Во втором примере значение отбрасывается.
Это более очевидно, если вы оба запустите в будущем и отмените его. Здесь я создаю два одновременных фьючерса:
- создаем
S
и ждем 200 мс - ждем 100 мс и отменяем будущее # 1
use futures::future::{self, AbortHandle, Abortable};
use std::time::Duration;
use tokio::time;
struct S {
i: i32,
}
impl S {
fn new(i: i32) -> Self {
println!("Creating S {}", i);
S { i }
}
}
impl Drop for S {
fn drop(&mut self) {
println!("Dropping S {}", self.i);
}
}
#[tokio::main]
async fn main() {
let create_s = async {
let s = S::new(42);
time::delay_for(Duration::from_millis(200)).await;
println!("Creating {} done", s.i);
};
let (abort_handle, abort_registration) = AbortHandle::new_pair();
let create_s = Abortable::new(create_s, abort_registration);
let abort_s = async move {
time::delay_for(Duration::from_millis(100)).await;
abort_handle.abort();
};
let c = tokio::spawn(create_s);
let a = tokio::spawn(abort_s);
let (c, a) = future::join(c, a).await;
println!("{:?}, {:?}", c, a);
}
Creating S 42
Dropping S 42
Ok(Err(Aborted)), Ok(())
Обратите внимание, что я переключился на Tokio, чтобы иметь возможность использовать time::delay_for
, поскольку вы никогда не должны использовать блокирующие операции в асинхронной функции c.
См. Также:
Если будущее породит другие фьючерсы, все ли они прервутся в цепочке?
Нет, когда вы spawn
a будущее, оно отключено от того места, где оно было создано.
См. также: