我有一个测试用例,它试图并发运行异步方法。我的代码尝试启动。其中有50个,但当我运行它时,只有大约12个在异步方法的开头打印该语句。
我需要做些什么才能让它们同时运行?
use futures::executor;
use futures::future;
use async_std;
async fn _spin(i: u32) {
println!("starting {}", i);
loop {
//do work
}
}
fn main() {
let mut futures = vec![];
for i in 0..50 {
futures.push(_spin(i));
}
let handles = futures.into_iter().map(async_std::task::spawn).collect::<Vec<_>>();
let joined = future::join_all(handles);
let _results = executor::block_on(joined);
}输出。请注意,运行的那些似乎是随机挑选的。
starting 0
starting 7
starting 12
starting 2
starting 11
starting 16
starting 10
starting 17
starting 1
starting 15
starting 3
starting 13发布于 2020-05-12 14:24:42
如果你调用一个“阻塞”函数,即。一个在不调用await的情况下完成大量工作的函数,那么您应该使用spawn_blocking而不是spawn,这样该函数将获得一个专用的线程。否则,将根据执行器派生任务。在async-std中,默认的执行器是一个线程池,它的线程数最多与逻辑核心数一样多。但是,您可以在其他执行器上派生任务,包括具有不同线程数量的线程池:
futures::executor::ThreadPool;
let pool = ThreadPool::builder()
.pool_size (2)
.create()
.unwrap();
pool.spawn_ok (async { /* do work */ });
/* Wait for tasks to complete */https://stackoverflow.com/questions/61726508
复制相似问题