什么是启用使用Tokio轮询future所需的最小功能集?

7

我想轮询一个异步函数:

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    some_function().await;
}

我目前正在启用所有功能:
tokio = { version = "1.4.0", features = ["full"] }

哪些是必要的?
full = [
  "fs",
  "io-util",
  "io-std",
  "macros",
  "net",
  "parking_lot",
  "process",
  "rt",
  "rt-multi-thread",
  "signal",
  "sync",
  "time",
]

1
保持关闭它们直到它无法编译,我想? - tadman
1个回答

16

为了在Tokio中启用对未来的轮询,您需要一个Runtime

这仅支持crate功能rt

[dependencies]
tokio = { version = "1.4.0", features = ["rt"] }
fn main() -> Result<(), Box<dyn std::error::Error>> {
    tokio::runtime::Builder::new_current_thread()
        .build()
        .unwrap()
        .block_on(some_function())
}

async fn some_function() -> Result<(), Box<dyn std::error::Error>> {
    Ok(())
}
如果你想要使用tokio::main宏:

这仅支持crate特性rtmacros

[dependencies]
tokio = { version = "1.4.0", features = ["rt", "macros"] }
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    some_function().await
}

async fn some_function() -> Result<(), Box<dyn std::error::Error>> {
    Ok(())
}

如果您想要您指定的确切语法(这不是“启用使用Tokio轮询未来的最小功能集”),那么运行时错误会指导您:

默认的运行时风格是multi_thread,但rt-multi-thread功能被禁用了。

[dependencies]
tokio = { version = "1.4.0", features = ["rt", "rt-multi-thread", "macros"] }
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    some_function().await
}

async fn some_function() -> Result<(), Box<dyn std::error::Error>> {
    Ok(())
}

另请参阅:


谢谢。我之前尝试过,但是因为出现了“main函数不允许是异步”的错误,所以我认为这是不可能的。是否可以导入更多的内容来使#[tokio::main]正常工作? - Gatonito
2
@Gatonito 要使用 tokio::main 属性,您需要启用 "macros" 特性,并且默认运行时是多线程的,因此您需要使用 "rt-multi-thread" 而不是 "rt" - kmdreko
你能否提供一个示例,说明如何保持 fn main 非异步?我知道有 block_on,但我想知道是否有一种方法可以像对于异步函数的 std::thread::spawn 一样进行轮询以完成/加入它而不需要 await。我正在制作一个 DLL,由于 C FFI 的原因,我不能导出 async 函数。 - Brandon Ros
@BrandonRos 这里的示例只是为了说明。虽然源代码中写着 async fn main,但是 #[tokio::main] 过程宏会将其重写为 fn main - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接