Learn Rust Coding · Lekcja

Wprowadzenie do Async/Await

Poznają Państwo podstawy funkcji `async` i wyrażeń `await` potrzebnych do pisania asynchronicznego, nieblokującego kodu.

Lekcja 1 z 311 kroki

Wprowadzenie do Async/Await to bezpłatna lekcja Learn Rust Coding na CoddyKit. To lekcja 1 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn Rust Coding, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn Rust Coding zawiera 3 lekcji w sumie.

Dlaczego programowanie asynchroniczne?

W programowaniu zadania często wiążą się z oczekiwaniem. Może to być oczekiwanie na załadowanie pliku, zakończenie żądania sieciowego lub zwrócenie wyników zapytania do bazy danych.

Tradycyjnie programy blokują wykonanie podczas takiego oczekiwania, czyli wstrzymują wszystkie pozostałe operacje do czasu zakończenia zadania. Może to sprawić, że aplikacje będą działać wolno i przestaną reagować.

Gdy kod czeka...

Rozważmy ten prosty przykład operacji blokującej. Program wstrzyma działanie na 2 sekundy przed wyświetleniem drugiego komunikatu.

Proszę go uruchomić:

use std::thread;
use std::time::Duration;

fn main() {
  println!("Starting a blocking task...");
  thread::sleep(Duration::from_secs(2)); // This blocks!
  println!("Blocking task finished!");
}

Koszt oczekiwania

W poprzednim przykładzie czekał cały program. Gdyby był to serwer internetowy, oznaczałoby to, że podczas oczekiwania na bazę danych dla jednego użytkownika nie można byłoby obsłużyć żadnego innego użytkownika!

Programowanie asynchroniczne pozwala rozpocząć długotrwałe zadanie, a następnie zająć się inną pracą zamiast czekać. Gdy długotrwałe zadanie będzie gotowe, program może do niego powrócić.

Podejście asynchroniczne w Rust

Rust udostępnia zaawansowane mechanizmy językowe do programowania asynchronicznego: słowa kluczowe async i await.

  • Funkcje async to specjalne funkcje, których wykonywanie można wstrzymywać i wznawiać.
  • .await służy wewnątrz funkcji async do oczekiwania na zakończenie innego zadania asynchronicznego bez blokowania całego programu.

Definiowanie funkcji `async`

Funkcję asynchroniczną deklaruje się, dodając słowo kluczowe async przed fn. Funkcja async zawsze zwraca obiekt typu Future.

Future to wartość, która może nie być jeszcze gotowa. Reprezentuje obliczenie, które ostatecznie zwróci wynik.

async fn my_async_task() -> u32 {
  // This task will eventually return 42
  42
}

Wstrzymywanie za pomocą `.await`

Słowo kluczowe .await sprawia, że programowanie asynchroniczne nie blokuje wykonania. Gdy użyją Państwo .await dla obiektu Future, funkcja async:

  • wstrzyma własne wykonywanie,
  • pozwoli programowi wykonać inne zadania,
  • wznowi działanie, gdy oczekiwany obiekt Future będzie gotowy.

Przypomina to naciśnięcie przycisku pauzy dla bieżącego zadania na czas wykonywania innego zadania.

Uruchamianie kodu asynchronicznego: executory

Funkcja async zwraca obiekt typu Future, ale nie wykonuje od razu zawartego w niej kodu. Obiekty Future są leniwe.

Aby rzeczywiście uruchomić funkcję async i wykonać jej obiekt Future, potrzebny jest executor. W prostych przykładach można użyć futures::executor::block_on, który wykonuje obiekt Future do końca w bieżącym wątku.

Pierwszy program z `async`/`await`

Oto jak współdziałają elementy async, await i prosty executor. Proszę zwrócić uwagę, że w funkcji main użyto block_on do uruchomienia procesu asynchronicznego.

Ten przykład symuluje asynchroniczne opóźnienie bez blokowania wątku funkcji main (koncepcyjnie; samo block_on blokuje wykonanie do czasu zakończenia obiektu Future, ale samo zadanie asynchroniczne oddaje sterowanie).

use futures::executor::block_on;
use std::time::Duration;

async fn learn_and_wait() {
  println!("Learning asynchronously...");
  // Simulate an async operation that takes time
  // In a real app, this would be an I/O op
  tokio::time::sleep(Duration::from_secs(1)).await;
  println!("Finished learning!");
}

fn main() {
  println!("Starting main function.");
  block_on(learn_and_wait());
  println!("Main function finished.");
}

Zrozumienie cechy `Future`

Po napisaniu async fn my_func() Rust w rzeczywistości przekształca ją w automat stanów implementujący cechę Future.

Cecha Future ma jedną główną metodę — poll — którą executor wielokrotnie wywołuje, aby sprawdzić, czy zadanie może kontynuować działanie. Gdy obiekt Future zostanie użyty z .await, informuje executor, aby odpytywał inny obiekt Future do momentu jego zakończenia.

Szybkie sprawdzenie: podstawy Async/Await

Poznali Państwo podstawy async i await. Sprawdźmy, czy potrafią Państwo wskazać ich najważniejsze role.

Powtórzenie i dalsze kroki

Świetna praca! Wykonali Państwo pierwsze kroki w programowaniu asynchronicznym w Rust.

  • Zobaczyliśmy, że bloki kodu synchronicznego blokują wykonywanie programu, zmuszając go do oczekiwania.
  • Kod asynchroniczny pozwala zadaniom działać współbieżnie bez blokowania.
  • Słowo kluczowe async deklaruje funkcję asynchroniczną, która zwraca obiekt typu Future.
  • Słowo kluczowe .await wstrzymuje funkcję async do momentu, aż obiekt typu Future będzie gotowy.
  • Do uruchamiania obiektów typu Future potrzebny jest wykonawca (taki jak block_on).

W następnej części zajmiemy się Tokio — rozbudowanym środowiskiem uruchomieniowym i ekosystemem do tworzenia rzeczywistych aplikacji asynchronicznych w Rust!

Bezpłatny start

Ucz się Rust dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
39
Lekcje
144

Często zadawane pytania

Czy lekcja „Wprowadzenie do Async/Await” jest bezpłatna?

Tak — pełny tekst „Wprowadzenie do Async/Await” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn Rust Coding, przejdź na CoddyKit PRO. Kurs Learn Rust Coding zawiera 3 lekcji w sumie.

Co nauczysz się w „Wprowadzenie do Async/Await”?

Poznają Państwo podstawy funkcji `async` i wyrażeń `await` potrzebnych do pisania asynchronicznego, nieblokującego kodu. Ćwiczysz Learn Rust Coding z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Learn Rust Coding?

Nie wymagamy żadnego doświadczenia. Learn Rust Coding w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 3.

Ile czasu zajmuje lekcja „Wprowadzenie do Async/Await”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Learn Rust Coding?

Tak. Każda lekcja Learn Rust Coding zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wprowadzenie do Async/Await
  2. Tworzenie aplikacji asynchronicznych za pomocą Tokio
  3. Praca z futures i zadaniami
← Powrót do Learn Rust Coding