我有一个测试用例,试图同时运行异步方法。我的代码尝试启动。其中有50个,但是当我运行它时,只有大约12个在async方法的开头打印该语句。
我需要怎么做才能使它们同时运行?
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
最佳答案
如果您调用“阻止”功能,即。一个无需调用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 */
关于rust - 多个非返回函数调用中只有一部分与async/await同时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61726508/