gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:48:55 28 4
gpt4 key购买 nike

我是使用rust 的新手,并且首次尝试在 rust 中进行异步。在此示例中,我使用async-std运行cpu密集的递归斐波那契数列操作,并且无论我运行一个任务还是两个任务,这大约花费了相同的时间(〜7秒)。

异步运行时似乎正在多个线程上执行任务。

有什么方法可以强制异步任务在同一线程上运行?

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


最佳答案

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

This module is similar to std::thread, except it uses asynchronous tasks in place of threads.



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

如果要顺序处理数据,可以实现一个工作程序生产者模式:

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

具有 cargo 依赖关系:
[dependencies]
async-std = { version = "1.5", features = ["attributes"] }
flume = "0.7"

关于rust - 如何强制 `async_std`任务在rust中的单个线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61537355/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com