Параллелизм Rust с join и tokio

0

Вопрос

Я пытаюсь запустить две функции параллельно с join.

Мой код прост:

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

Но что бы я ни делал, это займет 4 часа —2s + 2s—, в то время как это должно занять 2 секунды, если я не ошибаюсь:

start: 37ns
end: 4.01036111s

Я чего-то не понимаю?

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

Лучший ответ

1

Вы вызываете функции сна std, которые переводят поток операционной системы в спящий режим, на котором работает ваша программа. Если вы позвоните в tokio::time::sleep функции вместо этого фьючерсы должны оцениваться одновременно.

Чтобы включить фактический параллелизм при выполнении, вам нужно будет использовать tokio::task::spawn чтобы позволить среде выполнения решать, в каком потоке запускать порожденное будущее.

Для дальнейшего чтения о том, что такое блокировка, я рекомендую этот отличный пост в блоге: https://ryhl.io/blog/async-what-is-blocking/

2021-11-22 21:16:29

Я вижу… Поэтому, как только мы войдем в асинхронность с Tokio, мы должны полагаться на него во всей асинхронной работе. Я посмотрю на эту ссылку, большое спасибо.
miravelardo

На других языках

Эта страница на других языках

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