Hrdza súbežnosť s pripojiť a tokio

0

Otázka

Snažím sa bežať dve funkcie súbežne s join.

Môj kód je jednoduchý:

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 bez ohľadu na to, čo robím, to trvá 4s —2s + 2s—, pričom je potrebné brať 2s ak nie som mýli:

start: 37ns
end: 4.01036111s

Je tam niečo, čo som chýba?

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

Najlepšiu odpoveď

1

Voláte sa std spánku funkcií, ktoré dal OS závit na spánok, že program je spustený. Ak ste zavolať tokio::time::sleep funkcie namiesto toho, futures by mali byť hodnotené súčasne.

Ak chcete zapnúť skutočný paralelizmus v exekúcie, budete musieť použiť tokio::task::spawn ak chcete, aby runtime rozhodnúť, ktoré závit na spustenie splodil budúcnosti.

Pre ďalšie čítanie o tom, čo blokovanie je, odporúčam tento výborný blog post: https://ryhl.io/blog/async-what-is-blocking/

2021-11-22 21:16:29

Vidím... a Tak, keď sme sa dostali do async s Tokio, musíme sa spoľahnúť na to, pre všetky async práce. Budem sa pozrieť na tento odkaz, díky moc.
miravelardo

V iných jazykoch

Táto stránka je v iných jazykoch

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