运行Axum官方示例代码时编译报错:默认运行时为`multi_thread`但`rt-multi-thread`功能未启用
运行Axum官方示例代码时编译报错:默认运行时为
multi_thread但rt-multi-thread功能未启用 我之前试Axum官方示例的时候也踩过这个坑,这个错误本质是Tokio的运行时配置不匹配导致的:
#[tokio::main]这个宏默认会启用多线程运行时(multi_thread),但咱们在Cargo.toml里只加了基础的Tokio依赖,没有开启对应的rt-multi-thread功能,所以编译器就报错了。
解决方案一:修改Cargo.toml添加必要的Tokio特性(推荐)
最稳妥的方式是给Tokio依赖添加需要的特性,既支持多线程运行时,又能正常使用#[tokio::main]宏。修改后的Cargo.toml如下:
[package] name = "axum-play" version = "0.1.0" edition = "2021" [dependencies] axum = "0.8.4" serde = { version = "1.0.219", features = ["derive"] } # 添加上rt-multi-thread(多线程运行时)和macros(支持tokio::main宏)特性 tokio = { version = "1.44.2", features = ["rt-multi-thread", "macros"] } # 或者用"full"特性一次性开启所有常用功能(适合快速测试) # tokio = { version = "1.44.2", features = ["full"] } tracing = "0.1.41" tracing-subscriber = "0.3.19"
解决方案二:改用单线程运行时(适合简单场景)
如果你的服务不需要多线程,也可以修改#[tokio::main]的参数,指定使用单线程运行时,这样不用改Cargo.toml:
// 把原来的#[tokio::main]改成下面这样 #[tokio::main(flavor = "current_thread")] async fn main() { // 原有的代码逻辑不变... tracing_subscriber::fmt::init(); let app = Router::new() .route("/", get(root)) .route("/users", post(create_user)); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap(); }
验证修正效果
改完之后,重新执行cargo run,应该就能正常编译并启动Axum服务了:
- 访问
http://localhost:3000会返回Hello, World! - 给
http://localhost:3000/users发POST请求(带JSON body{"username": "test"}),会返回状态码201和对应的用户JSON。
内容来源于stack exchange
相关产品推荐
相关产品推荐

