从 tokio::test 在 tokio 中生成任务

Spawning a task in tokio from tokio::test

我大致有以下tokio::main

#[tokio::main]
pub async fn my_tokio_main() {
    let addr = "[::1]:9002";
    let listener = TcpListener::bind(&addr).await.expect("Can't listen");

    while let Ok((stream, _)) = listener.accept().await {
        // Handle the connection
    }
}

大致经过以下测试:

#[tokio::test]
async fn test_hello() {
    task::spawn(my_tokio_main());
//              ^^^^^^^^^^^^^^^ `()` is not a future

}

但是,在构建测试时,编译器抱怨 () 不是未来

我的理解是,因为 my_tokio_main()async,所以它 return 一个未来。为什么编译器在这里抱怨?

您在 main 函数上有 #[tokio::main] 属性。此属性会将函数转换为同步函数,这将创建一个 tokio 运行时并调用 runtime.block_on(future),其中 future 是定义的异步函数的结果。

因此实际生成的my_tokio_main是同步的。您可以将 tokio::main 包装器和 async 函数定义分开,以便从另一个异步函数调用异步函数。