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

标签 rust async-await

我有一个测试用例,试图同时运行异步方法。我的代码尝试启动。其中有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/

相关文章:

asynchronous - 如何在 Jest 中让 promise 超时?

javascript - 带有异步/等待的 super 代理/ super 测试

rust - 如何在通用结构中定义 const 闭包

unix - 通过将 ctrl-c 发送到标准输入来将 SIGINT 发送到进程

javascript - 如何让异步变成同步

javascript - 从获取返回的 Promise 中分配变量

c# - MVC4 WebApi 进程启动器

installation - 通过 cargo : specified package has no binaries 安装箱子时出错

pointers - 为什么 Deref::deref 的返回类型本身就是一个引用?

rust - 外部模块中不可见的通用特征