Lwt.async() не работает должным образом
Я разрабатываю веб-сервис в 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? С или без асинхронного поведения в основном то же самое.
1 ответ
Управление переключится обратно на обработчик HTTP, только если асинхронный поток блокирует ожидание чего-либо. Если он просто использует процессор на 100% до тех пор, пока не завершит работу, асинхронный поток, вероятно, сначала будет завершен. Попробуйте поставить сон в тестах, чтобы проверить.