Ocaml lwt 永无止境的循环

标签 ocaml ocaml-lwt

我正在尝试使用 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

粗略地说,这就是上面代码中发生的事情:

  1. echo_loop () 应用在Lwt_main.run 的参数中。这会立即开始评估 Lwt_io.(read_line stdin),但其余代码(从 if 表达式开始)将放入闭包中,一旦 read_line 完成。 echo_loop () 然后评估正在进行的 read_line 操作和闭包的组合。
  2. Lwt_main.run 强制您的进程等待所有操作完成。但是,一旦 read_line 完成,如果该行不是 exit,则闭包会触发 write_line 操作,然后是另一个闭包,它调用 echo_loop () 递归地开始另一个 read_line,并且可以无限期地继续下去。

关于Ocaml lwt 永无止境的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40693893/

相关文章:

haskell - 使用函数式语言(例如 F#)的函数的参数名称

types - ocaml类型 'a. ' a->'a是什么意思?

ocaml - 安装 ocamlfind.1.3.3 时出错配置 : m4 not in PATH; this is required

ocaml - 如何从异步代码中使用 Lwt 库?

regex - 使用正则表达式验证数字范围

asynchronous - 使用 OCaml Async 并发写入

garbage-collection - 如何停止 OCaml 垃圾收集我的响应式(Reactive)事件处理程序?

unit-testing - OCaml 使用异步编写超时函数

ocaml - 编译 ocaml-websocket 失败