我正在尝试用Lwt编写一个终端应用程序。基本上,就像我的应用程序运行的时间一样长,我需要观察终端的Lwt_io.read_line输入。
在我的程序运行时,有比下面的(伪代码)更好的方法来实现某种循环吗?
while true do
let _ = ignore (Lwt_main.run my_application)
done我不确定这是不是正确的方法。每次my_application的所有线程都完成后,Lwt_main.run就会再次被调用&再次&再次.
是否有其他或更好的方法来处理Lwt?
发布于 2016-11-19 16:43:20
您通常会将主循环编写为递归函数,该函数的计算结果为线程,然后将该线程一次传递给Lwt_main.run。下面是一个小例子:
let () =
let rec echo_loop () =
let%lwt line = Lwt_io.(read_line stdin) in
if line = "exit" then
Lwt.return_unit
else
let%lwt () = Lwt_io.(write_line stdout line) in
echo_loop ()
in
Lwt_main.run (echo_loop ())可以通过以下方式编译和运行:
ocamlfind opt -linkpkg -package lwt.unix -package lwt.ppx code.ml && ./a.out粗略地说,这就是上面代码中发生的情况:
echo_loop ()应用于Lwt_main.run的论证中。这立即开始计算Lwt_io.(read_line stdin),但是代码的其余部分(从if表达式开始)被放入一个闭包中,以便在read_line完成后运行。然后,echo_loop ()计算为正在进行的read_line操作的这种组合,然后是闭包。Lwt_main.run强制您的流程等待,直到所有这些完成。但是,一旦read_line完成,如果行不是exit,则闭包将触发一个write_line操作,然后是另一个闭包,后者递归地调用echo_loop (),从而启动另一个read_line,这种情况可以无限期地继续下去。https://stackoverflow.com/questions/40693893
复制相似问题