我是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)
}
}发布于 2020-05-01 16:06:40
根据async_std::task的文档,你不能。
此模块类似于std::thread,不同之处在于它使用异步任务代替线程。
因此,它旨在启动一个新线程,就像您使用std::thread::spawn启动一个新线程一样。
如果您希望按顺序处理数据,可以实现worker producer模式:
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)
}
}具有货物依赖关系:
[dependencies]
async-std = { version = "1.5", features = ["attributes"] }
flume = "0.7"https://stackoverflow.com/questions/61537355
复制相似问题