我正在Mirageos(UNIX)上开发Ocaml
中的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内部的功能实际上并不重要,考虑到应忽略的任何返回/所做的函数。我错了吗?
最后,我的问题是:为什么客户实际上必须等待线程接收确定响应?有或没有异步,行为基本上是相同的。
控制只有在等待某物的异步线块时,才会切换回HTTP处理程序。如果仅使用CPU 100%直到完成,则异步线可能会首先运行到完成。尝试在测试中睡觉。