Ruggine concorrenza con join e tokio

0

Domanda

Sto cercando di eseguire due funzioni in parallelo con join.

Il mio codice è semplice:

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());
}

Ma non importa quello che faccio, questo prende 4s —2s + 2s—, mentre si dovrebbe prendere 2s se non sbaglio:

start: 37ns
end: 4.01036111s

C'è qualcosa che mi manca?

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

Migliore risposta

1

Si chiama std del sonno funzioni che mette il sistema operativo thread a dormire che il programma è in esecuzione. Se si chiama il tokio::time::sleep funzioni, invece, il futuro dovrebbe essere valutata contemporaneamente.

Per attivare effettivo parallelismo in esecuzione, è necessario utilizzare tokio::task::spawn per lasciare il runtime di decidere quale thread per l'esecuzione generato futuro.

Per un approfondimento su ciò che il blocco è, vi consiglio questo ottimo blog post: https://ryhl.io/blog/async-what-is-blocking/

2021-11-22 21:16:29

Capisco... Così una volta che otteniamo in asincrono con Tokio, dobbiamo fare affidamento su di esso per tutto il lavoro asincrono. Do un'occhiata a questo link, grazie mille.
miravelardo

In altre lingue

Questa pagina è in altre lingue

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