Zaawansowane
Async, zadania i workery
Wybierz nieblokujące I/O, zadania zakresowe albo izolowane obliczenia CPU.
Leniwe Future i await
async fn zwraca leniwe Future<T>. await prowadzi je do zakończenia. Asynchroniczne operacje na plikach, procesach, HTTP i timerach współdzielą executor działający w jednym wątku.
1async fn delayed(value: int) -> Result<int, string> {2 (await time.sleep_async(100))?3 return Ok(value * 2)4}56async fn main() -> Result<void, string> {7 let first = task.spawn(delayed(20))8 let second = task.spawn(delayed(21))9 print((await task.join(first))?)10 print((await task.join(second))?)11 return Ok()12}1314print(await main())
Zadania strukturalne
task.spawn uruchamia Future w bieżącym zakresie leksykalnym. Zakres czeka na niezakończone dzieci przed wyjściem. join zwraca wynik, cancel prosi o anulowanie, a timeout wyznacza deadline.
Równoległe workery CPU
worker.spawn wykonuje izolowane źródło w ograniczonej puli natywnych wątków. Wartości przekraczają granicę przez serializację, dlatego closures, modułów, struktur, Future, Task, Worker i cyklicznych wartości nie można przesyłać.
1async fn main() -> Result<void, string> {2 let handle = worker.spawn(3 "worker_input * worker_input",4 125 )6 let result = (await worker.join(handle))?7 print(result.value)8 return Ok()9}1011await main()
Uporządkowane parallel.map
parallel.map stosuje izolowane źródło do listy wejściowej w puli workerów. Wyniki zachowują kolejność wejścia, a pozostała praca jest anulowana po błędzie elementu.
1async fn main() -> Result<void, string> {2 let results = (await parallel.map(3 "worker_input * worker_input",4 [2, 3, 4]5 ))?6 print(results)7 return Ok()8}910await main()