Lwt.async() 未按预期工作
Lwt.async() not working as expected
我正在 MirageOS(Unix) 之上的 Ocaml
中开发 Web 服务,目前我在使用 Lwt.async()
时遇到了一些问题。 Lwt 文档说明如下:
val async : (unit -> 'a t) -> unit
async f starts a thread without
waiting for the result. If it fails (now or later), the exception is
given to Lwt.async_exception_hook.
You should use this function if you want to start a thread that might
fail and don't care what its return value is, nor when it terminates
(for instance, because it is looping).
所以我立即考虑 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 中的函数在做什么并不重要,考虑到任何 returns/does 都应该被忽略。我错了吗?
最后,我的问题是:为什么客户端实际上必须等待线程接收到 OK 响应?使用或不使用异步,行为基本相同。
如果异步线程阻塞等待某事,控制只会切换回 HTTP 处理程序。如果它只使用 CPU 100% 直到它完成,那么异步线程可能会先 运行 完成。尝试在测试中睡觉以检查。
我正在 MirageOS(Unix) 之上的 Ocaml
中开发 Web 服务,目前我在使用 Lwt.async()
时遇到了一些问题。 Lwt 文档说明如下:
val async : (unit -> 'a t) -> unit
async f starts a thread without waiting for the result. If it fails (now or later), the exception is given to Lwt.async_exception_hook.
You should use this function if you want to start a thread that might fail and don't care what its return value is, nor when it terminates (for instance, because it is looping).
所以我立即考虑 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 中的函数在做什么并不重要,考虑到任何 returns/does 都应该被忽略。我错了吗?
最后,我的问题是:为什么客户端实际上必须等待线程接收到 OK 响应?使用或不使用异步,行为基本相同。
如果异步线程阻塞等待某事,控制只会切换回 HTTP 处理程序。如果它只使用 CPU 100% 直到它完成,那么异步线程可能会先 运行 完成。尝试在测试中睡觉以检查。