Paralelizm Rust z join i tokio

0

Pytanie

Próbuję uruchomić dwie funkcje równolegle z join.

Mój kod jest prosty:

tokio = { version = "1.14.0", features = ["full"] }
use tokio::join;
use std::thread::sleep;
use std::time::{Duration, Instant};

async fn fn_1() -> i8 {
  sleep(Duration::from_secs(2));

  2
}

async fn fn_2() -> i8 {
  sleep(Duration::from_secs(2));

  1
}

#[tokio::main]
async fn main() -> () {
  let now = Instant::now();

  println!("start: {:#?}", now.elapsed());

  let a = fn_1();
  let b = fn_2();

  join!(a, b);

  println!("end: {:#?}", now.elapsed());
}

Ale co bym nie robił, to zajmie 4 godziny —2s + 2s— w tym czasie jak to powinno trwać 2 sekundy, jeśli się nie mylę:

start: 37ns
end: 4.01036111s

Ja czegoś nie rozumiem?

async-await asynchronous rust rust-tokio
2021-11-22 21:08:44
1

Najlepsza odpowiedź

1

Wywołaniu funkcji snu std, które przekładają się strumień systemu w tryb uśpienia, na którym działa twój program. Jeśli zadzwonisz w tokio::time::sleep funkcje zamiast tego kontrakty powinny być oceniane w tym samym czasie.

Aby włączyć rzeczywisty paralelizm po uruchomieniu, trzeba będzie korzystać z tokio::task::spawn aby pozwolić na środowisko wykonawcze rozwiązania, w jakim strumieniu uruchamianie stworzonego przyszłość.

Do dalszego czytania o tym, co to jest blokada, polecam ten świetny post na blogu: https://ryhl.io/blog/async-what-is-blocking/

2021-11-22 21:16:29

Widzę Więc, jak tylko wejdziemy do asynchroniczny z Tokio, musimy polegać na nim w całej asynchronicznej pracy. Sprawdzę ten link, bardzo dziękuję.
miravelardo

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................