Lwt.async()没有按预期工作

时间:2016-12-05 16:52:10

标签: multithreading asynchronous ocaml ocaml-lwt mirage

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

  

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

     

异步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 个答案:

答案 0 :(得分:2)

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