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
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