lwt
Lwt 5.8.0, Lwt_ppx 5.8.0
Lwt 是 OCaml 的並發程式庫。它提供了單一資料類型: promise ,這是一個將在未來確定的值。創建一個承諾會產生一個計算。當該計算是 I/O 時,Lwt 與 OCaml 程式碼並行運行。
OCaml 程式碼(包括建立和等待 Promise)預設在單一執行緒中運行,因此您不必擔心鎖定或搶佔。您可以根據選擇分離要在單獨執行緒中執行的程式碼。
這是一個簡單的 Lwt 程序,它請求 Google 首頁,如果請求在五秒內未完成,則失敗:
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
強制執行整個承諾計算網路。所有可見的 OCaml 程式碼都在單一執行緒中運行,但 Lwt 在內部使用工作執行緒和非阻塞文件描述符的組合來並行解析執行 I/O 的承諾。
Lwt 在 Linux、macOS、Windows 和其他系統上編譯為本機程式碼。它也通常由 js_of_ocaml 編譯為前端 JavaScript 和 Node。
在輕重量中,
Lwt
提供了承諾...Lwt_unix
幾乎綁定了每個 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 聊天、在 Discord.ocaml.org 或 Stack Overflow 上提問。
發佈公告在discuss.ocaml.org 上發布。觀看「僅限發布」的儲存庫也是一種選擇。
CONTRIBUTING.md
包含處理程式碼的技巧,例如如何簽出程式碼、審查如何運作等。