Lwt.async() 未按预期工作

Lwt.async() not working as expected

我正在 MirageOS(Unix) 之上的 Ocaml 中开发 Web 服务,目前我在使用 Lwt.async() 时遇到了一些问题。 Lwt 文档说明如下:

val async : (unit -> 'a t) -> unit

async f starts a thread without waiting for the result. If it fails (now or later), the exception is given to Lwt.​async_exception_hook.

You should use this function if you want to start a thread that might fail and don't care what its return value is, nor when it terminates (for instance, because it is looping).

所以我立即考虑 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 中的函数在做什么并不重要,考虑到任何 returns/does 都应该被忽略。我错了吗?

最后,我的问题是:为什么客户端实际上必须等待线程接收到 OK 响应?使用或不使用异步,行为基本相同。

如果异步线程阻塞等待某事,控制只会切换回 HTTP 处理程序。如果它只使用 CPU 100% 直到它完成,那么异步线程可能会先 运行 完成。尝试在测试中睡觉以检查。