Я разрабатываю веб-сервис в Ocaml
поверх MirageOS (Unix), и в данный момент у меня проблемы с Lwt.async()
. В документации Lwt указано следующее:
val async : (unit -> 'a t) -> unit
async f запускает поток, не дожидаясь результата. В случае сбоя (сейчас или позже) исключение передается Lwt.async_exception_hook.
Вам следует использовать эту функцию, если вы хотите запустить поток, который может завершиться ошибкой, и вам все равно, какое возвращаемое значение или когда он завершится (например, из-за зацикливания).
Поэтому я сразу же посчитал Lwt.async хорошим кандидатом для запуска некоторых тестов и проверки того, что на самом деле выполнение является асинхронным. К сожалению, это не работает, как ожидалось. Мой код следующий:
let http_callback conn_id req _body =
Lwt.return(Uri.path (Cohttp.Request.uri req))
>>= function
| "/tester" -> Cohttp_lwt_body.to_string _body >>= fun res ->
log_lwt ~inject:(fun f -> f "Testing") >>= fun () ->
Lwt.async(fun () -> TEST.start 100 res !listOfIP);
H.respond_string ~status:`OK ~body:("DONE") ()
in
let spec = H.make ~callback:http_callback () in
CON.listen conduit (`TCP 8080) (H.listen spec)
Для ясности, TEST.start выполняет серию многопоточных операций. Я предполагаю, что на самом деле не имеет значения, что делает функция внутри Lwt.async, учитывая, что все, что возвращает/делает, следует игнорировать. Я ошибся?
В конце концов, мой вопрос: почему на самом деле клиент должен ждать, пока поток получит ответ OK? С асинхронностью или без нее поведение в основном одинаковое.