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
包含处理代码的技巧,例如如何签出代码、审查如何工作等。还有代码库的高级概述。