Nach der Einführung des “Future”-Trait ergänzt Rust 1.39 “async” und “.await”. Der für Rust gefundene Ansatz soll asynchrones Programmieren ohne Zusatzkosten erlauben.
Async/Await, wie das Feature auch in anderen Programmiersprachen heißt, erlaubt es, zum aktuellen Zeitpunkt eine Funktion oder einen Block zu definieren, die ihr Ergebnis, den Future, erst nach einer gewissen Zeit zurück liefert. In dieser Wartezeit blockiert das Programm aber nicht, sondern gibt die Kontrolle an die Runtime zurück. Der “.await”-Part wartet auf das Ergebnis und prozessiert es, sobald es verfügbar ist. Das ermöglicht es, parallele Tasks ressourcensparend im selben Thread auszuführen.
Um Async-Funktionen zu definieren, genügt es, “async” vor eine Funktion zu schreiben. Beim Aufruf dieses Codes führt die Funktion nichts aus, sondern liefert nur einen Future zurück. Erst wenn tatsächlich ein Ergebnis verfügbar ist, führt “.await” den Future aus:
async fn another_function() {
// Create the future:
let future = first_function();
// Await the future, which will execute it (and suspend
// this function if we encounter a need to wait for I/O):
let result: u32 = future.await;
[...]
}
Anders als andere Sprachen verwendet Rust ein “poll”-Modell: Die Sprache generiert den Future nicht sofort, um ihn auf die Ausführung vorzubereiten. Vielmehr testet ein Future Executor über “poll” ob der Future bereit ist (“wake()”) und führt ihn dann aus. Weitere “polls” folgen, bis der Future seinen Job erledigt hat. Dieses Zero-Cost-Modell verhindert, dass Rust für jeden Future Ressourcen bereitstellen muss.
Laut einem Blogpost zum Thema ist Await/Async noch nicht komplett fertig, sondern ein “Minimum Viable Product” (MVP). Die Entwickler wollen es also in den kommenden Fassungen von Rust weiter stabilisieren und polieren. Unter anderem müssen jetzt die Async-IO-Runtimes die neue Syntax einbauen. Über weitere Neuerungen von Rust 1.39 informiert der Blogpost zum Release.




