Ocaml lwt 永无止境的循环
Ocaml lwt never ending loop
我正在尝试使用 Lwt 编写终端应用程序。
基本上只要我的应用程序是 运行,我就需要用 Lwt_io.read_line.
查看终端的输入
在我的程序 运行 时,是否有比以下(伪代码)更好的方法来实现某种循环?
while true do
let _ = ignore (Lwt_main.run my_application)
done
我不确定这是否正确。每次来自 my_application 的所有线程都完成时,Lwt_main.run 会被一次又一次地调用...
是否有其他或更好的方法来使用 Lwt 处理此问题?
您通常会将主循环编写为递归函数,该函数求值为一个线程,然后将该线程一次传递给 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)
,但是一旦 read_line
完成,其余代码(从 if
表达式开始)将被放入闭包中成为 运行。 echo_loop ()
然后评估正在进行的 read_line
操作的组合,然后关闭。
Lwt_main.run
强制您的进程等待所有完成。但是,一旦 read_line
完成,如果该行不是 exit
,闭包会触发一个 write_line
操作,然后是另一个闭包,它递归地调用 echo_loop ()
,这会启动另一个read_line
,这可以无限期地持续下去。
我正在尝试使用 Lwt 编写终端应用程序。 基本上只要我的应用程序是 运行,我就需要用 Lwt_io.read_line.
查看终端的输入在我的程序 运行 时,是否有比以下(伪代码)更好的方法来实现某种循环?
while true do
let _ = ignore (Lwt_main.run my_application)
done
我不确定这是否正确。每次来自 my_application 的所有线程都完成时,Lwt_main.run 会被一次又一次地调用...
是否有其他或更好的方法来使用 Lwt 处理此问题?
您通常会将主循环编写为递归函数,该函数求值为一个线程,然后将该线程一次传递给 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)
,但是一旦read_line
完成,其余代码(从if
表达式开始)将被放入闭包中成为 运行。echo_loop ()
然后评估正在进行的read_line
操作的组合,然后关闭。Lwt_main.run
强制您的进程等待所有完成。但是,一旦read_line
完成,如果该行不是exit
,闭包会触发一个write_line
操作,然后是另一个闭包,它递归地调用echo_loop ()
,这会启动另一个read_line
,这可以无限期地持续下去。