首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有一部分多个非返回函数调用与async/await同时运行

只有一部分多个非返回函数调用与async/await同时运行
EN

Stack Overflow用户
提问于 2020-05-11 17:34:22
回答 1查看 50关注 0票数 0

我有一个测试用例,它试图并发运行异步方法。我的代码尝试启动。其中有50个,但当我运行它时,只有大约12个在异步方法的开头打印该语句。

我需要做些什么才能让它们同时运行?

代码语言:javascript
复制
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);
}

输出。请注意,运行的那些似乎是随机挑选的。

代码语言:javascript
复制
starting 0
starting 7
starting 12
starting 2
starting 11
starting 16
starting 10
starting 17
starting 1
starting 15
starting 3
starting 13
EN

回答 1

Stack Overflow用户

发布于 2020-05-12 14:24:42

如果你调用一个“阻塞”函数,即。一个在不调用await的情况下完成大量工作的函数,那么您应该使用spawn_blocking而不是spawn,这样该函数将获得一个专用的线程。否则,将根据执行器派生任务。在async-std中,默认的执行器是一个线程池,它的线程数最多与逻辑核心数一样多。但是,您可以在其他执行器上派生任务,包括具有不同线程数量的线程池:

代码语言:javascript
复制
futures::executor::ThreadPool;
let pool = ThreadPool::builder()
    .pool_size (2)
    .create()
    .unwrap();
pool.spawn_ok (async { /* do work */ });
/* Wait for tasks to complete */
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61726508

复制
相关文章

相似问题

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