【问题标题】:Ocaml lwt never ending loopOcaml lwt 永无止境的循环
【发布时间】:2016-11-19 14:16:47
【问题描述】:

我正在尝试使用 Lwt 编写终端应用程序。 基本上只要我的应用程序正在运行,我需要使用 Lwt_io.read_line 观察终端的输入。

在我的程序运行时,是否有比以下(伪代码)更好的方法来实现某种循环?

while true do
  let _ = ignore (Lwt_main.run my_application)
done

我不确定这是否是正确的方法。每次来自 my_application 的所有线程都完成时,Lwt_main.run 会再次被调用一次又一次......

还有其他或更好的方法可以用 Lwt 处理这个问题吗?

【问题讨论】:

    标签: ocaml ocaml-lwt


    【解决方案1】:

    您通常会将主循环编写为递归函数,该函数计算一个线程,然后将该线程一次传递给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,这样就可以了无限期开启。

    【讨论】:

    • 我觉得自己像个白痴,没想到这一点......感谢您的广泛回复!
    猜你喜欢
    • 2016-06-04
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2020-03-14
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多