2

我正在OcamlMirageOS(Unix) 之上开发一个 Web 服务,目前我在使用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 响应?无论有没有异步,行为基本相同。

4

1 回答 1

2

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

于 2016-12-05T17:45:00.910 回答