Rust - Передача объектов-черт в потоки

Я боролся с этим некоторое время и просто ходил кругами, поэтому я надеюсь, что кто-то может указать, где я иду не так.

Я играю с Actix Web и настраиваю свои первые обработчики - это простая проверка работоспособности системы. Итак, что у меня есть:

  • Healthcheck черта, определяющая проверку здоровья
  • HealthcheckHandler структура, которая реализует Handler черта (это концепция Actix Web) и содержит HashMap
  • Функция, которая создает App экземпляр для маршрутов Healthcheck (это концепция Actix Web), принимая HashMap<String, &Healthcheck>

Когда я пытаюсь построить это, я получаю ошибки, что черта "не может быть безопасно передана между потоками".

Я пробовал с &Healthcheck, Box<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 ответов

Другие вопросы по тегам