You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

actix-web启动Actor触发spawn_local相关panic该如何解决?

问题根因

你遇到的panic核心是依赖版本不兼容,你的实现逻辑本身没有问题。
actix-web 3.3.2依赖actix-rt 1.x运行时,而actix 0.12.0依赖actix-rt 2.x运行时:

  • 两个版本的actix-rt底层对tokio的LocalSet管理逻辑完全不同
  • actix-web 3的#[actix_web::main]是重导出的actix-rt 1.x的主宏,无法满足actix 0.12对运行时环境的要求,所以启动Actor调用spawn_local时找不到对应的LocalSet触发panic
  • 你替换为#[actix_rt::main]能正常运行,是因为你项目里实际依赖的是actix-rt 2.x版本,运行时环境匹配,但这种跨版本混用运行时的方式存在隐形风险,不建议长期使用。
解决方案

有两种稳定的修复方案可选:

方案1:升级actix-web到4.x版本(推荐)

actix-web 4.x默认使用actix-rt 2.x运行时,和actix 0.12完全兼容。

  1. 修改Cargo.toml依赖:
actix-web = "4"
actix = "0.12"
  1. 调整代码中状态注册的写法(actix-web 4将.data()方法替换为.app_data(),需要手动包裹web::Data):
#[actix_web::main]
async fn main() -> std::io::Result<()> {
    let addr = MyActor.start();
    
    HttpServer::new(move || {
        App::new()
            .app_data(web::Data::new(AppState {
                actor_addr: addr.clone(),
            }))
            .route("/", web::get().to(greet))
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

方案2:降级actix到0.10.x版本

如果不想升级actix-web大版本,可以将actix降级到和actix-web 3.3.2匹配的0.10.x版本,该版本依赖actix-rt 1.x运行时,原有代码不需要任何修改。
修改Cargo.toml依赖即可:

actix-web = "3.3.2"
actix = "0.10"

内容的提问来源于stack exchange,提问作者Oni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:57:03