Ошибка довольно явно не связана с владельцем или временем жизни:
error: future cannot be sent between threads safely
gotham_restful::State
не реализует черту Sync
, что означает, что ее ссылка &state
не является потокобезопасным. Однако вы передаете эту ссылку асинхронной функции, которая затем ожидается, и компилятор Rust автоматически делает вывод, что эта функция не является поточно-ориентированной, поэтому весь блок становится «не поточно-безопасным». Возвращаемое значение метода read_all
имеет ограничение + <a href="https://doc.rust-lang.org/stable/std/marker/trait.Send.html" rel="nofollow noreferrer">Send</a>
, однако требует, чтобы возвращаемое будущее было потокобезопасным, поэтому это вызывает ошибку.
Одним из возможных решений является перезапись do_sth
быть обычной функцией, которая возвращает будущее. Таким образом, вы можете убедиться, что возвращаемое будущее от этой функции реализует Send
и является поточно-ориентированным, вместо того, чтобы полагаться на то, что компилятор определит, где он поточно-безопасен:
fn do_sth(_state: &State) -> impl Future<Output = NoContent> + Send {
// require that the future of this function is thread-safe ---^
async move {
Default::default()
}
}
Обратите внимание, что это фактически не позволит вам делать что-либо, что не является потокобезопасным, однако он сообщит компилятору, что функция do_sth
должна быть поточно-безопасной, вместо того, чтобы пытаться вручную сделать вывод, должно ли это быть или нет.