La rouille de la simultanéité avec jointure et tokio

0

La question

Je suis en train de lancer deux fonctions en parallèle avec join.

Mon code est simple:

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

Mais peu importe ce que je fais, cela prend 4s —2s + 2s—, alors qu'il devrait prendre 2s si je ne me trompe pas:

start: 37ns
end: 4.01036111s

Est-il quelque chose que je suis absent?

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

La meilleure réponse

1

Vous appelez les mst fonctions du sommeil qui a mis le système d'exploitation fil de sommeil que votre programme est en cours d'exécution sur. Si vous appelez la tokio::time::sleep fonctions au lieu de cela, les contrats à terme doivent être évalués simultanément.

Pour activer réel parallélisme dans l'exécution, vous aurez besoin d'utiliser tokio::task::spawn pour laisser l'exécution de décider quel thread pour exécuter le engendré avenir.

Pour en savoir plus sur ce blocage est, je recommande cet excellent post de blog: https://ryhl.io/blog/async-what-is-blocking/

2021-11-22 21:16:29

Je vois... Donc, une fois que nous obtenons en asynchrone avec Tokio, nous devons compter sur elle pour tous les async travail. Je vais jeter un oeil à ce lien, merci beaucoup.
miravelardo

Dans d'autres langues

Cette page est dans d'autres langues

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