Dokumentacja/Zaawansowane

Zaawansowane

Async, zadania i workery

Wybierz nieblokujące I/O, zadania zakresowe albo izolowane obliczenia CPU.

Około 16 minWersja: 0.10.1

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.

async.orvi
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ć.

worker.orvi
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.

parallel.orvi
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()