Rust-将特质对象传递给线程

时间:2019-04-16 16:58:29

标签: rust rust-actix actix-web

我已经为此苦苦挣扎了好一阵子了,所以我希望有人能指出我要去哪里。

我正在使用Actix Web,并设置了我的第一个处理程序-这是对系统的简单Healthcheck。所以我得到的是:

  • 定义健康检查的Healthcheck特征
  • 实现HealthcheckHandler特性(这是Actix Web概念)并包含HashMap的Handler结构
  • 通过采用App来为运行状况检查路由构建HashMap<String, &Healthcheck>实例的函数(这是Actix Web概念)

当我尝试构建它时,出现错误,即“无法在线程之间安全地发送”特征。

我已经根据此处的另一个答案尝试了&HealthcheckBox<Healthcheck>Box<Healthcheck + Send>,甚至Mutex<&Healthcheck>都没有运气,但都略有不同。似乎所有这些都需要实现Sync,Send和/或Clone的一些组合,但是我不确定如何在这里解决。

有什么指针可以解决此问题吗?

实际示例代码:

pub trait Healthcheck {
    fn check(&self) -> Result<String, String>;
}
struct HealthcheckHandler {
    handlers: HashMap<String, Box<Healthcheck>>,
}
pub fn build_app(handlers: HashMap<String, Box<Healthcheck>>) -> App<()> {
    let handler = HealthcheckHandler {
        handlers: handlers,
    };

    App::new()
        .prefix("/health")
        .resource("", |r| {
            r.get().h(handler);
        })
}
pub fn start(settings: HashMap<String, String>) {
    let mut healthchecks: HashMap<String, Box<Healthcheck>> = HashMap::new();

    let server = server::new(|| { // <-- This is where the errors happen. This closure is used to spawn threads.
        vec![
            build_app(healthchecks).middleware(middleware::Logger::default())
        ]
    });
}

欢呼

0 个答案:

没有答案