从 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
函数定义分开,以便从另一个异步函数调用异步函数。
我大致有以下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
函数定义分开,以便从另一个异步函数调用异步函数。