Lwt é uma biblioteca de programação simultânea para OCaml. Ele fornece um único tipo de dados: a promessa , que é um valor que será determinado no futuro. Criar uma promessa gera um cálculo. Quando esse cálculo é E/S, Lwt o executa em paralelo com seu código OCaml.
O código OCaml, incluindo a criação e espera de promessas, é executado em um único thread por padrão, então você não precisa se preocupar com bloqueio ou preempção. Você pode desanexar o código para ser executado em threads separados, mediante aceitação.
Aqui está um programa Lwt simplista que solicita a página inicial do Google e falha se a solicitação não for concluída em cinco segundos:
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 *)
No programa, funções como Lwt_io.write
criam promessas. A construção let* ... in
é usada para esperar que uma promessa seja determinada; o código após in
está programado para ser executado em um "retorno de chamada". Lwt.pick
compete entre promessas e se comporta como o primeiro a completar. Lwt_main.run
força toda a rede de computação de promessas a ser executada. Todo o código OCaml visível é executado em um único thread, mas o Lwt usa internamente uma combinação de threads de trabalho e descritores de arquivo sem bloqueio para resolver em paralelo as promessas que fazem E/S.
Lwt compila para código nativo em Linux, macOS, Windows e outros sistemas. Também é compilado rotineiramente em JavaScript para front-end e Node por js_of_ocaml.
Em Lwt,
Lwt
oferece promessas...Lwt_unix
que liga quase todas as chamadas de sistema Unix. Um módulo de nível superior Lwt_io
fornece bons canais de E/S.Lwt_process
é para manipulação de subprocessos.Lwt_preemptive
gera threads do sistema.Lwt_react
para programação reativa. Veja o índice nas páginas de manual vinculadas! libev-dev
ou libev-devel
.opam install conf-libev lwt
Atualmente estamos trabalhando para melhorar a documentação do Lwt (drasticamente; estamos reescrevendo o manual). Enquanto isso:
Nota: grande parte do manual atual refere-se a 'a Lwt.t
como "threads leves" ou apenas "threads". Isso será corrigido no novo manual. 'a Lwt.t
é uma promessa e não tem nada a ver com sistema ou threads preemptivos.
Abra um problema, visite o bate-papo do Discord, pergunte em discuss.ocaml.org ou no Stack Overflow.
Os anúncios de lançamento são feitos em discuss.ocaml.org. Assistir ao repositório "Somente lançamentos" também é uma opção.
CONTRIBUTING.md
contém dicas para trabalhar no código, como como verificar o código, como funciona a revisão, etc. Há também um esboço de alto nível da base de código.