我正在Ocaml
MirageOS(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 响应?无论有没有异步,行为基本相同。