capypad
0 Tage Serie
rust / intermediate
Snippet

Async/Await mit Futures 0.1 Darstellung

Rusts async/await-Syntax baut auf dem Future-Trait auf. Ein Future repräsentiert einen Wert, der möglicherweise noch nicht verfügbar ist. Die poll-Methode wird vom Executor aufgerufen, um zu prüfen, ob die asynchrone Operation abgeschlossen wurde. Wenn nicht fertig, muss der Waker registriert werden, um den Executor später zu benachrichtigen.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use std::future::Future;
use std::task::{Poll, Context};
use std::pin::Pin;
 
struct DelayFuture {
remaining: u32,
}
 
impl Future for DelayFuture {
type Output = &'static str;
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
if self.remaining > 0 {
self.remaining -= 1;
println!("Polled {} times, still waiting...", 3 - self.remaining);
cx.waker().wake_by_ref();
Poll::Pending
} else {
Poll::Ready("Done waiting!")
}
}
}
 
async fn delayed_greeting() -> String {
let future = DelayFuture { remaining: 3 };
let result = future.await;
format!("Async result: {}", result)
}
 
fn main() {
let future = delayed_greeting();
println!("Created async future");
let waker = std::task::WakeNone;
}
Erklärung
1
struct DelayFuture { remaining: u32 }
Benutzerdefinierter Future-Typ hält Zustand für die Polling-Logik
2
fn poll(mut self: Pin<&mut Self>, cx: &mut Context)
Poll empfängt angehefteten Kontext und Waker zur Benachrichtigung
3
cx.waker().wake_by_ref()
Aufruf von wake_by_ref plant dieses Future zur erneuten Abfrage ein
4
Poll::Pending
Zurückgeben von Pending bedeutet Operation nicht abgeschlossen, Executor sollte warten
5
Poll::Ready("Done waiting!")
Zurückgeben von Ready mit Ausgabe zeigt an, dass Future abgeschlossen ist