首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在rust中强制`async_std`任务在单线程上运行?

如何在rust中强制`async_std`任务在单线程上运行?
EN

Stack Overflow用户
提问于 2020-05-01 13:35:25
回答 1查看 406关注 0票数 0

我是rust的新手,并且第一次尝试rust中的异步。在这个例子中,我使用async-std运行递归斐波那契级数的cpu密集型运算,无论我运行的是单个任务还是两个任务,所用的时间大致相同(~7秒)。

看起来异步运行时在多个线程上执行任务。

有没有办法强制异步任务在同一线程上运行?

代码语言:javascript
复制
use std::time;
use async_std::task;

fn main() {

    let start = time::Instant::now();

    let s1 = task::spawn(fib_async(46));
    let s2 = task::spawn(fib_async(46));

    task::block_on(s1);
    task::block_on(s2);
    let elap = time::Instant::now().duration_since(start);

    println!("time took for tasks to finish: {} seconds", elap.as_secs());

}


async fn fib_async(n: i32) -> i32 {
    fib(n)
}

fn fib(n: i32) -> i32 {
    if n == 0 || n == 1 {
        1
    } else {
        fib(n-1) + fib(n-2)
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-05-01 16:06:40

根据async_std::task的文档,你不能。

此模块类似于std::thread,不同之处在于它使用异步任务代替线程。

因此,它旨在启动一个新线程,就像您使用std::thread::spawn启动一个新线程一样。

如果您希望按顺序处理数据,可以实现worker producer模式:

代码语言:javascript
复制
use async_std::task;
use std::time;

#[async_std::main]
async fn main() {
    let (tx, rx) = flume::unbounded();

    let s = task::spawn(async move {
        for n in rx.into_iter() {
            println!("Calc fib of {}", n);
            let fib = fib_async(n).await;
            println!("{}", fib);
        }
    });

    let start = time::Instant::now();


    tx.send(40).unwrap();
    tx.send(40).unwrap();

    drop(tx);
    s.await;

    let elap = time::Instant::now().duration_since(start);
    println!("time took for tasks to finish: {} seconds", elap.as_secs());
}

async fn fib_async(n: i32) -> i32 {
    fib(n)
}

fn fib(n: i32) -> i32 {
    if n == 0 || n == 1 {
        1
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

具有货物依赖关系:

代码语言:javascript
复制
[dependencies]
async-std = { version = "1.5", features = ["attributes"] }
flume = "0.7"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61537355

复制
相关文章

相似问题

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