首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用join和tokio的Rust并发性

使用join和tokio的Rust并发性
EN

Stack Overflow用户
提问于 2021-11-22 21:08:44
回答 1查看 207关注 0票数 0

我正在尝试与join并行运行两个函数。

我的代码很简单:

代码语言:javascript
复制
tokio = { version = "1.14.0", features = ["full"] }
代码语言:javascript
复制
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());
}

但无论我做什么,这需要4s -2s + 2s-,而如果我没有弄错的话,应该需要2s:

代码语言:javascript
复制
start: 37ns
end: 4.01036111s

我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-22 21:16:30

您正在调用std的休眠函数,该函数将使您的程序正在运行的OS线程进入休眠状态。如果改为调用tokio::time::sleep函数,则应该并发计算期货。

要在执行中启用实际的并行性,您需要使用tokio::task::spawn让运行时决定在哪个线程上运行衍生的未来。

要进一步了解什么是阻塞,我推荐这篇优秀的博客文章:https://ryhl.io/blog/async-what-is-blocking/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70072388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档