3

Lwt で端末アプリケーションを作成しようとしています。基本的に、アプリが実行されている限り、Lwt_io.read_line でターミナルの入力を監視する必要があります。

プログラムの実行中に何らかのループを実現するために、次の (疑似コード) よりも良い方法はありますか?

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

これが正しい方法かどうかはわかりません。my_application からのすべてのスレッドが終了するたびに、Lwt_main.run が何度も何度も呼び出されます...

Lwt でこれを処理する他の方法またはより良い方法はありますか?

4

1 に答える 1

4

通常、メイン ループをスレッドに評価される再帰関数として記述し、そのスレッドを に 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-11-19T16:43:20.780 に答える