El óxido de concurrencia con la combinación y tokio

0

Pregunta

Estoy tratando de ejecutar dos funciones en paralelo con join.

Mi código es sencillo:

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

Pero no importa lo que haga, esto lleva 4s —2s + 2s— a la vez que se debe tomar 2 si no me equivoco:

start: 37ns
end: 4.01036111s

Hay algo que me falta?

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

Mejor respuesta

1

Está llamando a la sexual, el sueño de las funciones que poner el SO hilo a dormir que se ejecuta el programa. Si usted llama a la tokio::time::sleep funciones en lugar de ello, el futuro debe ser evaluado de forma simultánea.

Para habilitar real paralelismo en la ejecución, usted necesitará utilizar tokio::task::spawn para permitir que el tiempo de ejecución de decidir qué hilo para ejecutar el generado futuro.

Para leer más sobre lo que el bloqueo es, recomiendo este excelente post en el blog: https://ryhl.io/blog/async-what-is-blocking/

2021-11-22 21:16:29

Ya veo... Así que una vez que entramos en async con Tokio, tenemos que confiar en él para todas async trabajo. Voy a echar un vistazo a este enlace, muchas gracias.
miravelardo

En otros idiomas

Esta página está en otros idiomas

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