Lwt は、OCaml 用の同時プログラミング ライブラリです。これは単一のデータ型、 promiseを提供します。これは将来決定される値です。 Promise を作成すると計算が生成されます。その計算が I/O である場合、Lwt はそれを OCaml コードと並行して実行します。
Promise の作成や待機を含む OCaml コードは、デフォルトで単一スレッドで実行されるため、ロックやプリエンプションについて心配する必要はありません。オプトインに基づいて、コードを切り離して別のスレッドで実行できます。
以下は、Google フロントページをリクエストし、リクエストが 5 秒以内に完了しない場合は失敗する単純な Lwt プログラムです。
open Lwt.Syntax
let () =
let request =
let * addresses = Lwt_unix. getaddrinfo " google.com " " 80 " [] in
let google = Lwt_unix. (( List. hd addresses).ai_addr) in
Lwt_io. (with_connection google ( fun ( incoming , outgoing ) ->
let * () = write outgoing " GET / HTTP/1.1 rn " in
let * () = write outgoing " Connection: close rnrn " in
let * response = read incoming in
Lwt. return ( Some response)))
in
let timeout =
let * () = Lwt_unix. sleep 5. in
Lwt. return None
in
match Lwt_main. run ( Lwt. pick [request; timeout]) with
| Some response -> print_string response
| None -> prerr_endline " Request timed out " ; exit 1
(* ocamlfind opt -package lwt.unix -linkpkg example.ml && ./a.out *)
プログラムでは、 Lwt_io.write
などの関数が Promise を作成します。 let* ... in
構造は、Promise が決定されるのを待つために使用されます。 in
後のコードは、「コールバック」で実行されるようにスケジュールされています。 Lwt.pick
互いに約束を競い合い、最初に完了するものとして動作します。 Lwt_main.run
Promise 計算ネットワーク全体を強制的に実行します。表示されるすべての OCaml コードは単一のスレッドで実行されますが、Lwt は内部でワーカー スレッドとノンブロッキング ファイル記述子の組み合わせを使用して、I/O を実行する Promise を並行して解決します。
Lwt は、Linux、macOS、Windows、およびその他のシステム上でネイティブ コードにコンパイルされます。また、js_of_ocaml によってフロントエンドとノードの JavaScript に定期的にコンパイルされます。
Lwtでは、
Lwt
次のことを約束します...Lwt_unix
あります。上位モジュールLwt_io
優れた I/O チャネルを提供します。Lwt_process
はサブプロセス処理用です。Lwt_preemptive
システム スレッドを生成します。Lwt_react
など、他のヘルパーもいくつかあります。リンクされたマニュアル ページの目次を参照してください。 libev-dev
またはlibev-devel
と呼ばれることがよくあります。opam install conf-libev lwt
私たちは現在、Lwt ドキュメントの改善に取り組んでいます (大幅に、マニュアルを書き直しています)。その間に:
注: 現在のマニュアルの多くは'a Lwt.t
を「軽量スレッド」または単に「スレッド」と呼んでいます。これは新しいマニュアルで修正される予定です。 'a Lwt.t
約束であり、システムやプリエンプティブ スレッドとは何の関係もありません。
問題を開いて、Discord チャットにアクセスし、discuss.ocaml.org または Stack Overflow で質問してください。
リリースの発表は、discuss.ocaml.org で行われます。 「リリースのみ」のリポジトリを監視することもオプションです。
CONTRIBUTING.md
は、コードのチェックアウト方法、レビューの仕組みなど、コードの作業に関するヒントが含まれています。コード ベースの概要も含まれています。