У меня есть функция, которая принимает &mut io::Write
, и я хотел бы использовать ее для отправки потокового ответа с веб-сервера actix без необходимости буферизации всего ответа.Функция «выталкивает» данные, и я не могу изменить функцию (вот и вся предпосылка этого вопроса), чтобы использовать асинхронные потоки или другие виды опроса.
В настоящее время я вынужден использовать &mut Vec
(который реализует io::Write
), чтобы буферизовать весь результат и затем отправить Vec
в качестве тела ответа.Однако ответ может быть большим, поэтому я бы предпочел потоковую передачу без буферизации.
Есть ли какой-то адаптер, который бы реализовывал io::Write
, с блокировкой записи по мере необходимости в ответ на противодавление и был бы совместимымс типами, которые actix-web может использовать для ответов (например, futures::Stream
)?
fn generate(output: &mut io::Write) {
// ...
}
fn request_handler() -> Result<HttpResponse> {
thread::spawn(|| generate(/*???*/));
Ok(HttpResponse::Ok().body(/*???*/))
}
std::sync::mpsc
и futures::mpsc
имеют либо оба конца асинхронно, либо оба конца блокируются, поэтому не очевидно, какиспользуйте их в качестве адаптера между синхронизацией и асинхронным окончанием.