我正在尝试用Lwt编写终端应用程序。 基本上当我的应用程序运行时,我需要使用Lwt_io.read_line观看终端输入。
在我的程序运行时,是否有比下面(伪代码)更好的方法来实现某种循环?
while true do
let _ = ignore (Lwt_main.run my_application)
done
我不确定这是不是正确的方法。每次my_application中的所有线程都完成后,Lwt_main.run会再次被调用。再次&再次...
是否还有其他或更好的方法来处理Lwt?
答案 0 :(得分:4)
您通常会将主循环编写为递归函数,该函数计算为一个线程,然后将该线程传递给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
,这可以无限期地继续下去。