我正在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响应?无论有没有异步,行为基本相同。
答案 0 :(得分:2)
如果异步线程阻塞等待某事,控制将只切换回HTTP处理程序。如果它只使用CPU 100%直到它完成,那么异步线程可能会先运行完成。尝试在测试中进行睡眠检查。