Ferrugem simultaneidade com associação e tokio

0

Pergunta

Eu estou tentando executar duas funções em paralelo com join.

Meu código é simples:

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

Mas não importa o que eu faça, isso leva 4s —2s + 2s—, enquanto ele deve tomar 2s se não me engano:

start: 37ns
end: 4.01036111s

Existe algo que eu estou ausente?

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

Melhor resposta

1

O que você está chamando o std sono funções que colocar o SO thread para dormir que o seu programa está em execução. Se você chamar o tokio::time::sleep funções em vez disso, os futuros devem ser avaliados simultaneamente.

Para habilitar o real paralelismo na execução, você precisará usar tokio::task::spawn para permitir que o tempo de execução de decidir qual thread para executar o gerado no futuro.

Para ler mais sobre o que o bloqueio é, eu recomendo este excelente post do blog: https://ryhl.io/blog/async-what-is-blocking/

2021-11-22 21:16:29

Estou a ver... Assim, uma vez que entrar assíncrono com Tokio, temos de contar com ele para todo o trabalho assíncrona. Eu vou dar uma olhada nesse link, muito obrigado.
miravelardo

Em outros idiomas

Esta página está em outros idiomas

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